web-dev-qa-db-ja.com

Spring MVC:パス変数が必要かどうかを示す方法

私は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がないため、オプションにする必要があります。

手伝ってくれてありがとう!

38
curious1

オプションにする方法はありませんが、1つが@RequestMapping({"customer"})アノテーションを持ち、もう1つが@RequestMapping({"customer/{id}"})を持つ2つのメソッドを作成し、それぞれに応じてアクションを実行できます。

39
Tristan

VTTom`s ソリューションは正しい

@RequestMapping(method=GET, value={"/", "/{id}"})
public void get(@PathVariable Optional<Integer> id) {
  if (id.isPresent()) {
    id.get()   //returns the id
  }
}
54
Martin Cmarko

私はこれが古い質問であることを知っていますが、「オプションのパス変数」を検索するとこの答えが高くなるので、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
  }
}
29
VTTom

パスに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 ..

3
Aniket Thakur

「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;

}

0
Ashutosh