복붙노트

[SPRING] RequestMapping 우선 순위 지정 방법

SPRING

RequestMapping 우선 순위 지정 방법

다음과 같은 RequestMapping이 필요한 상황이 있습니다.

@RequestMapping(value={"/{section}"})
...method implementation here...

@RequestMapping(value={"/support"})
...method implementation here...

명백한 충돌이 있습니다. 내 희망은 Spring이이 문제를 자동으로 해결하고 두 번째 메소드 및 다른 모든 메소드를 첫 번째 메소드로 맵핑 / 지원하지만 대신 첫 번째 메소드로 맵핑 / 지원한다는 것입니다.

명시 적 RequestMapping이 같은 위치에있는 PathVariable과 함께 RequestMapping을 오버라이드하도록 Spring에 지시 할 수 있습니까?

편집 2 : / support 매핑이 / {section} 매핑 전에 왔을 때 작동하는 것으로 보입니다. 불행하게도 우리는 수십 개의 컨트롤러에 RequestMapping으로 수많은 메소드를 포함하고 있습니다. / {section} 매핑을 가진 컨트롤러가 마지막으로 초기화되었는지 어떻게 확인할 수 있습니까? 아니면 사전 요격기가 갈 길입니까?

편집 1 : 이것은 단순화 된 것으로, 두 개의 RequestMapping만으로는 의미가 없습니다.

해결법

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

    1.Spring을 사용하면 시나리오를 지원하기 위해 org.springframework.web.HttpRequestHandler를 확장 할 수 있습니다.

    Spring을 사용하면 시나리오를 지원하기 위해 org.springframework.web.HttpRequestHandler를 확장 할 수 있습니다.

    메소드 구현 :

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
    

    이를 사용하여 들어오는 요청을 분석하고 요청 URL이 요청 URL의 특수 하위 집합에 속하는지 그리고 적절한 위치로 전달되는지 확인하십시오.

    전의:

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    /** You will want to check your array of values and have this data cached  **/
    if (urlPath.contains("/sectionName")) {
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("sections" + "/" + urlPath);
            requestDispatcher.forward(request, response);
        }
    
    }
    

    다음과 같은 섹션을 설정하십시오.

    @RequestMapping(value={"/sections/{sectionName}"})
    

    이렇게하면 기존 컨트롤러 매핑을 방해하지 않습니다.

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

    2.2이 방법이 2 개의 다른 컨트롤러에 정의되어있는 경우 문제는 두 컨트롤러가 동일한 URL에 매핑되어 있다는 것입니다. 컨트롤러 초기화 순서를 지금 제어하지 않으므로 순서는 임의적입니다.

    2이 방법이 2 개의 다른 컨트롤러에 정의되어있는 경우 문제는 두 컨트롤러가 동일한 URL에 매핑되어 있다는 것입니다. 컨트롤러 초기화 순서를 지금 제어하지 않으므로 순서는 임의적입니다.

    나는 / {section} 전에 초기화 될 지원 매핑이 필요하다고 생각합니다.

    이를 달성하기 위해서는 컨트롤러 "섹션"을 컨트롤러 "지원"에 따라 정의하십시오. 이 방법으로 하나의 컨트롤러에 두 메서드를 함께 넣고 "section"앞에 "support"에 매핑 된 메서드를 넣으려는 시도가 도움이되지 않는다면

    나는 여기에 다른 제안이 작동하지 않습니다. "섹션"은 무엇입니까? 제한된 수의 값을 수용 할 수 있으면 enum으로 정의해야합니다. 이 경우 지원 및 섹션 메서드가 하나의 컨트롤러 또는 별도의 컨트롤러에있는 경우 모든 것이 필요한대로 작동합니다.

    행운을 빕니다.

  3. ==============================

    3.이것은 문제가되지 않는 것 같습니다. 이것은 유효한 매핑입니다. http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates를 확인하십시오.

    이것은 문제가되지 않는 것 같습니다. 이것은 유효한 매핑입니다. http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates를 확인하십시오.

    16.3.2 절에서 @RequestMapping으로 요청 매핑은 당신이 시도하는 것과 똑같이하는 두 개의 메소드가 존재합니다.

    클래스가 컴파일되고 있는지 확인하려면 클래스 수준에서 @RequestMapping ( "/ someprefix")을 추가하여 원하는대로 URL이 노출되어 있는지 확인하십시오.

    버전 3.1.0.RELEASE를 사용하여 로컬로 예제를 확인하고 아무런 문제도 없었습니다.

    해결 방법으로 (잘 이해할 수있는 REST URI를 제공하려면 두 번째 매핑에 몇 가지 컨텍스트를 추가하십시오.

    @RequestMapping(value={"client/support"}) // i.e: if you are working with clients
    public ModelAndView getsupport(@PathVariable Long supportId){
        // do your code here something here
      }
    

    물론 이것이 시스템에있는 고유 한 컨트롤러 인 경우 유효합니다. 그렇지 않으면 위에서 제안한대로 클래스 수준에서 RequestMapping을 사용해야합니다.

    이게 도움이 되길 바란다.

  4. ==============================

    4.Spring 3.1.2에서이 동작을 보지 못하고 있습니다. 이전 버전의 Spring과 관련된 버그 일 수 있습니다. 다음은 나에게 아무런 문제없이 실행되는 요지입니다 - https://gist.github.com/3802254

    Spring 3.1.2에서이 동작을 보지 못하고 있습니다. 이전 버전의 Spring과 관련된 버그 일 수 있습니다. 다음은 나에게 아무런 문제없이 실행되는 요지입니다 - https://gist.github.com/3802254

  5. from https://stackoverflow.com/questions/12647346/how-to-define-requestmapping-prioritization by cc-by-sa and MIT license