복붙노트

[SPRING] 스프링 웹 MVC : 요청 매개 변수와 경로 변수에 동일한 요청 매핑 사용

SPRING

스프링 웹 MVC : 요청 매개 변수와 경로 변수에 동일한 요청 매핑 사용

Spring 웹 MVC 컨트롤러 메소드가 URI 경로의 일부로 ID를 전달하는 요청과 일치해야한다는 것을 표현하는 방법이 있나요?

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

... 또는 클라이언트가 ID로 스타일의 HTTP 요청 매개 변수로 보내는 경우 ...

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {

이것은 나에게 중복 코드를 추가하고 싶지 않은 꽤 일반적인 실제 URL 스키마 인 것처럼 보이지만 아직 답을 찾을 수 없었습니다. 어떤 조언을 환영합니다.

편집 : 현재 (봄 MVC <= 3.0)이 달성 할 수있는 방법으로 보인다, Javi 응답 내의 토론을 참조하십시오.

해결법

  1. ==============================

    1.동일한 함수에 대한 매핑 URL과 설정 ID를 모두 선택적으로 설정할 수 있습니다.

    동일한 함수에 대한 매핑 URL과 설정 ID를 모두 선택적으로 설정할 수 있습니다.

    @RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
    public String getCampaignDetails(Model model,
         @RequestParam(value="id", required=false) Long id,
         @PathVariable("id") Long id2)
    {
    }
    

    id가 보내지지 않을 때도 맵핑되지만, 메소드 내에서 이것을 제어 할 수 있습니다.

    편집 : 이전 해결책은 @PathVariable이 {null}이 아니고 URL을 매핑 할 수 없을 때 null로 설정되지 않았기 때문에 작동하지 않습니다 (thanks ngeek). 가능한 유일한 해결책은 각각의 @MappingRequest로 매핑 된 두 개의 메소드를 생성하고 그 중 하나는 다른 함수를 호출하거나 다른 URL로 리디렉션하는 것입니다 (리디렉션 또는 전달 : 스프링 접두사). 나는이 해결책이 당신이 찾고있는 것이 아니지만 당신이 할 수있는 최선이라고 생각합니다. 실제로 코드를 복제하는 것이 아니라 다른 URL을 처리하는 또 다른 함수를 만드는 중입니다.

  2. ==============================

    2.여전히 PathVariable 접근 방식을 고수하고 400 구문 적으로 잘못된 오류가 발생하는 경우이 접근 방식을 따르십시오.

    여전히 PathVariable 접근 방식을 고수하고 400 구문 적으로 잘못된 오류가 발생하는 경우이 접근 방식을 따르십시오.

     @RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"})
                             public String getCampaignDetails(Model model,
                             @PathVariable Map<String, String> pathVariables) 
       {
    
         System.out.println(pathVariables.get("id"));
    
       }
    
  3. ==============================

    3.@RequestMapping 어노테이션은 이제 이름이나 값 대신 경로 속성을 설정할 수 있습니다. 경로를 사용하면이 질문에서 원하는 매핑을 얻을 수 있습니다.

    @RequestMapping 어노테이션은 이제 이름이나 값 대신 경로 속성을 설정할 수 있습니다. 경로를 사용하면이 질문에서 원하는 매핑을 얻을 수 있습니다.

    @RequestMapping(method=RequestMethod.GET, path="campaigns/{id}")
    public String getCampaignDetails(Model model, @PathVariable("id") Long id) {
    
    @RequestMapping(method=RequestMethod.GET, value="campaigns")
    public String getCampaignDetails(Model model, @RequestParam("id") Long id) {
    
  4. from https://stackoverflow.com/questions/2745471/spring-web-mvc-use-same-request-mapping-for-request-parameter-and-path-variable by cc-by-sa and MIT license