web-dev-qa-db-ja.com

Springでは、オプションのパス変数を作成できますか?

Spring 3.0では、オプションのパス変数を使用できますか?

例えば

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

ここで、/json/abcまたは/jsonが同じメソッドを呼び出すようにします。
1つの明らかな回避策は、リクエスト変数としてtypeを宣言します。

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @RequestParam(value = "type", required = false) String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

そして/json?type=abc&track=aaまたは/json?track=rrが動作します

165
Shamik

オプションのパス変数は使用できませんが、同じサービスコードを呼び出す2つのコントローラーメソッドを使用できます。

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return getTestBean(type);
}

@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testBean(
        HttpServletRequest req,
        @RequestParam("track") String track) {
    return getTestBean();
}
170
earldouglas

Spring 4.1とJava 8を使用している場合、Spring MVCでJava.util.Optional@RequestParam@PathVariable@RequestHeaderでサポートされている@MatrixVariableを使用できます-

@RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
    @PathVariable Optional<String> type,
    @RequestParam("track") String track) {      
    if (type.isPresent()) {
        //type.get() will return type value
        //corresponds to path "/json/{type}"
    } else {
        //corresponds to path "/json"
    }       
}
94
Aniket Thakur

@PathVariableアノテーションを使用してパス変数のマップを挿入できることもよく知られていません。この機能がSpring 3.0で利用可能かどうか、または後で追加されたかどうかはわかりませんが、例を解決する別の方法を次に示します。

@RequestMapping(value={ "/json/{type}", "/json" }, method=RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
    @PathVariable Map<String, String> pathVariables,
    @RequestParam("track") String track) {

    if (pathVariables.containsKey("type")) {
        return new TestBean(pathVariables.get("type"));
    } else {
        return new TestBean();
    }
}
73
Paul Wardrip

以下を使用できます。

@RequestParam(value="somvalue",required=false)

pathVariableではなく、オプションのパラメーターの場合

24
Maleck13

Spring 5/Spring Boot 2の例:

ブロッキング

@GetMapping({"/dto-blocking/{type}", "/dto-blocking"})
public ResponseEntity<Dto> getDtoBlocking(
        @PathVariable(name = "type", required = false) String type) {
    if (StringUtils.isEmpty(type)) {
        type = "default";
    }
    return ResponseEntity.ok().body(dtoBlockingRepo.findByType(type));
}

反応する

@GetMapping({"/dto-reactive/{type}", "/dto-reactive"})
public Mono<ResponseEntity<Dto>> getDtoReactive(
        @PathVariable(name = "type", required = false) String type) {
    if (StringUtils.isEmpty(type)) {
        type = "default";
    }
    return dtoReactiveRepo.findByType(type).map(dto -> ResponseEntity.ok().body(dto));
}
6
wildloop

これを確認してください Spring 3 WebMVC-オプションのパス変数 。 AntPathMatcherの拡張機能を作成して、オプションのパス変数を有効にする記事を示しています。 Sebastian Herold へのすべてのクレジットは、記事の投稿に対して。

3
Uresh Kuruhuri

Nicolai Ehmannのコメントとwildloopの回答(Spring 4.3.3+)の簡単な例、今すぐrequired = falseを使用できます:

  @RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
  public @ResponseBody TestBean testAjax(@PathVariable(required = false) String type) {
    if (type != null) {
      // ...
    }
    return new TestBean();
  }
0
rogerdpack