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
が動作します
オプションのパス変数は使用できませんが、同じサービスコードを呼び出す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();
}
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"
}
}
@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();
}
}
以下を使用できます。
@RequestParam(value="somvalue",required=false)
pathVariableではなく、オプションのパラメーターの場合
@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));
}
これを確認してください Spring 3 WebMVC-オプションのパス変数 。 AntPathMatcherの拡張機能を作成して、オプションのパス変数を有効にする記事を示しています。 Sebastian Herold へのすべてのクレジットは、記事の投稿に対して。
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();
}