1

REST ベースのサービスに取り組んでおり、同じために Spring MVC を使用しています。URL からメソッドへの解決の問題に直面しています。これは大まかに私たちがやろうとしていることです

ペットを飼っている人がいるとします

//Class level request mapping
@RequestMapping("/persons")

// Mapping to access a specific person inside one of the methods
@RequestMapping(value="/{personId}", method= RequestMethod.GET
//.... getPerson method


// Mapping to access a specific person's pets inside one of the methods
@RequestMapping(value="/{personId}/pets", method= RequestMethod.GET
// getPersonPets method

リクエストが "/persons/P12323233" である場合、P12323233 は個人 ID であり、getPerson メソッドに解決されます。リクエストが「/persons/P12323233/pets」である場合、P12323233 は個人 ID であり、getPersonPets メソッドに解決されます。

だから今まではすべて順調です。しかし、リクエストが「/persons/pets」の場合、リクエストは getPerson メソッドに解決されます。これは getPerson メソッド内でエラー ケースとして処理できますが、getPersonPets へのこの呼び出しを解決する方法があるかどうかを確認しようとしています。方法。

このケースを処理する適切な場所が getPerson または getPersonPets メソッドのどちらであるかについては、まだ議論中です。その議論はさておき、getPersonPets メソッドへの解決を達成することが技術的に実現可能であるかどうかを知りたかったのです。

どんな助けにも感謝します。

4

3 に答える 3

1

これは、同じメソッドに複数のマッピングを追加することで解決できます。

@RequestMapping(value="/{personId}", method= RequestMethod.GET
//.... getPerson method

@RequestMapping(value = {"/{personId}/pets", "/pets"}, method= RequestMethod.GET
// getPersonPets method

更新: 次の署名を使用すると、URL にpersonIdが存在しないため、/petsにアクセスするときに例外がスローされることに注意してください。

public String showPets(@PathVariable("personId") long personId)

これは変数にアクセスする最も便利な方法ですが、複数のパスが同じメソッドにマップされている場合、例外の取得を避けるために署名を次のように変更できます。

public String showPets(@PathVariable Map<String, String> vars)

マップからパス変数を取得します

于 2013-08-22T11:59:07.113 に答える
1

正規表現を使用して、404 などの要求を除外することもできます。たとえば、次のようになります。

// Mapping to access a specific person inside one of the methods
@RequestMapping(value="/{personId:P[\\d]+}", method= RequestMethod.GET
//.... getPerson method


// Mapping to access a specific person's pets inside one of the methods
@RequestMapping(value="/{personId:P[\\d]+}/pets", method= RequestMethod.GET
// getPersonPets method
于 2013-08-22T12:01:32.630 に答える
0

通常、REST は、リソースでセグメントを指定していない場合は ID を参照していると想定しますが、残りのエンドポイントがあいまいさを軽減するために ID を追加するのが好きです。

API の変更が許可されている場合は、次のことを検討してください。

//Class level request mapping
@RequestMapping("/persons")

// Mapping to access a specific person inside one of the methods
@RequestMapping(value="/id/{personId}", method= RequestMethod.GET
//.... getPerson method


// Mapping to access a specific person's pets inside one of the methods
@RequestMapping(value="/id/{personId}/pets", method= RequestMethod.GET
// getPersonPets method
于 2013-08-22T16:21:16.013 に答える