[spring] 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호출하고 싶습니다 .
한 가지 확실한 해결 방법 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에 대한 모든 크레딧기사를 게시 한