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
호출하고 싶습니다 .
한 가지 확실한 해결 방법 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
작동합니다
답변
선택적 경로 변수를 가질 수는 없지만 동일한 서비스 코드를 호출하는 두 가지 컨트롤러 메소드를 가질 수 있습니다.
@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을 사용한다면 java.util.Optional
있는 지원되는 @RequestParam
, @PathVariable
, @RequestHeader
및 @MatrixVariable
스프링 MVC에서 –
@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)
경로가 아닌 선택적 매개 변수의 경우
답변
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));
}
답변
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();
}
답변
이 Spring 3 WebMVC-선택적 경로 변수를 확인하십시오 . 선택적 경로 변수를 활성화하고 도움이 될 수 있도록 AntPathMatcher로 확장하는 기사를 보여줍니다. Sebastian Herold에 대한 모든 크레딧기사를 게시 한