私はSpring Webをやっています。コントローラーメソッドの場合、RequestParamを使用して、パラメーターが必要かどうかを示すことができます。例えば:
@RequestMapping({"customer"})
public String surveys(HttpServletRequest request,
@RequestParam(value="id", required = false) Long id,
Map<String, Object> map)
次のようなPathVariableを使用したいと思います。
@RequestMapping({"customer/{id}"})
public String surveys(HttpServletRequest request,
@PathVariable("id") Long id,
Map<String, Object> map)
パス変数が必要かどうかを表示するにはどうすればよいですか?新しいオブジェクトを作成するとき、保存されるまで利用可能な関連IDがないため、オプションにする必要があります。
手伝ってくれてありがとう!
オプションにする方法はありませんが、1つが@RequestMapping({"customer"})
アノテーションを持ち、もう1つが@RequestMapping({"customer/{id}"})
を持つ2つのメソッドを作成し、それぞれに応じてアクションを実行できます。
VTTom`s ソリューションは正しい
@RequestMapping(method=GET, value={"/", "/{id}"})
public void get(@PathVariable Optional<Integer> id) {
if (id.isPresent()) {
id.get() //returns the id
}
}
私はこれが古い質問であることを知っていますが、「オプションのパス変数」を検索するとこの答えが高くなるので、Spring 4.1以降ではJava 1.8を使用してこれが可能ですJava.util.Optionalクラス。
例は次のようになります(値は、一致する必要があるすべての潜在的なルートをリストする必要があります。つまり、idパス変数がある場合とない場合に注意してください。
@RequestMapping(method=GET, value={"/", "/{id}"})
public void get(@PathVariable Optional<Integer> id) {
if (id.isPresent()) {
id.get() //returns the id
}
}
パスにIDがないと一致しないため(つまり、対応するHandlerMapping
が見つからないため)、VTTomsの回答は機能せず、結果としてコントローラーはヒットしません。むしろあなたができる-
@RequestMapping({"customer/{id}","customer"})
public String surveys(HttpServletRequest request, @PathVariable Map<String, String> pathVariablesMap, Map<String, Object> map) {
if (pathVariablesMap.containsKey("id")) {
//corresponds to path "customer/{id}"
}
else {
//corresponds to path "customer"
}
}
他の人が言及したJava.util.Optional
を使用することもできますが、Spring 4.1+およびJava 1.8 ..
「Optional」(@ PathVariable Optional id)またはMap(@PathVariable Map pathVariables)を使用すると、コントローラーメソッドを呼び出してHATEOASリンクを作成しようとすると、Spring-hateoasがpre Java8。「オプション」のサポートはありません。また、@ PathVariable Mapアノテーションを持つメソッドの呼び出しにも失敗します。
以下は、Mapの失敗を示す例です。
@RequestMapping(value={"/subs","/masterclient/{masterclient}/subs"}, method = RequestMethod.GET)
public List<Jobs> getJobListTest(
@PathVariable Map<String, String> pathVariables,
@RequestParam(value="count", required = false, defaultValue = defaultCount) int count)
{
if (pathVariables.containsKey("masterclient"))
{
System.out.println("Master Client = " + pathVariables.get("masterclient"));
}
else
{
System.out.println("No Master Client");
}
//Add a Link to the self here.
List list = new ArrayList<Jobs>();
list.add(linkTo(methodOn(ControllerJobs.class).getJobListTest(pathVariables, count)).withSelfRel());
return list;
}