복붙노트

[SPRING] Spring MVC 매핑에서 우선 순위를 어떻게 설정합니까?

SPRING

Spring MVC 매핑에서 우선 순위를 어떻게 설정합니까?

2 개의 스프링 컨트롤러 매핑이 있습니다.

@Controller
public class ContentController {

    @RequestMapping(value = "**/{content}.html")
    public String content(@PathVariable String content, Model model, HttpServletRequest request) {
    }
}

@Controller
public class HomeController {

    @RequestMapping(value = "**/home")
    public String home(HttpServletRequest request, Model model) {
    }
}

다음 url은 두 매핑을 일치시킵니다. /home.html

그러나 '홈'매핑보다 '콘텐츠'매핑이 항상 우선 순위를 갖도록하고 싶습니다. 내가 지정할 수있는 방법이 있습니까?

해결법

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

    1.나는 두 종류의 모호한 URL을 가지고있는 최근에 매우 비슷한 문제를 가지고 있습니다.

    나는 두 종류의 모호한 URL을 가지고있는 최근에 매우 비슷한 문제를 가지고 있습니다.

    "연도"컨트롤러 메소드가 "슬러그"컨트롤러 메소드보다 우선 순위를 차지하는 것이 중요했습니다. 불행히도 (나를 위해) Spring은 항상 "슬러그"컨트롤러 메소드를 사용했습니다.

    Spring MVC는보다 구체적인 매핑을 선호하기 때문에 "슬러그"패턴을 덜 구체적으로 만들어야했습니다. 경로 패턴 비교 문서를 기반으로 슬러그 매핑에 와일드 카드를 추가했습니다. @RequestMapping ( "/ {slug} **")

    내 컨트롤러 모양과 지금 listByYear는 1 년 (/ 2012, / 1998 등)이 URL에있을 때 호출됩니다.

    @Controller
    public class ContentController
    {
        @RequestMapping(value = "/{slug}**")
        public String content(@PathVariable("slug") final String slug)
        {
            return "content";
        }
    }
    

    @Controller
    public class IndexController
    {
        @RequestMapping("/{year:(?:19|20)\\d{2}}")
        public String listByYear()
        {
            return "list";
        }
    }
    

    이것은 정확히 내 우선 순위 (놀라운 점은 놀라운 기능)를 설정하는 것이 아니라 "좋은"임시 해결 방법을 제공하고 장래에 도움이 될 수 있습니다.

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

    2.URL 맵핑은 맵핑이 발견 된 순서에 따라 결정됩니다.

    URL 맵핑은 맵핑이 발견 된 순서에 따라 결정됩니다.

    그래서 당신은 하나의 컨트롤러가 다른 컨트롤러 뒤에 스프링 컨텍스트로 생성되게 할 수 있습니다.

    이것은 Bean 정의 (XML에서)의 depends-on = ""속성을 사용하여 수행 할 수 있습니다.

    첫 번째 매핑이 사용되는지 아니면 마지막 매핑이 사용되는지 확실하지 않습니다.

    또한 이것은 단지 이론 일 뿐이며 실제로 시도하지 않았습니다.

    다음과 같은 로그 메시지가 표시됩니다.

    17:29:01.618 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler    'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
    17:29:01.625 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0'
    

    SimpleUrlHandlerMapping을 사용하여 작동 방식을 살펴볼 가치가 있습니다.

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

    3.이 url (/home.html)은 두 매핑을 모두 일치시키지 않습니다.

    이 url (/home.html)은 두 매핑을 모두 일치시키지 않습니다.

        @RequestMapping(value = "**/{content}.html")
        ...
        @RequestMapping(value = "**/home")
        …
    

    접미사 ".html"이 있기 때문에 첫 번째 것과 일치합니다!

  4. from https://stackoverflow.com/questions/14440991/how-do-i-set-priority-on-spring-mvc-mapping by cc-by-sa and MIT license