복붙노트

[SPRING] DefaultAnnotationHandlerMapping의 작동 방식

SPRING

DefaultAnnotationHandlerMapping의 작동 방식

DefaultAnnotationHandlerMapping 작동 방식에 대해 혼란스러워합니다.

내 web.xml에 내가 가지고있는

 <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/somePath/someWork</url-pattern>

    <url-pattern>/users</url-pattern>
    <url-pattern>/user/*</url-pattern>
  </servlet-mapping>  

나는 이런 컨트롤러를 가지고있다.

   @RequestMapping(value="/user/adduser", method={RequestMethod.POST})
    public void addAdmin(@ModelAttribute("myData") myData data) {

        System.out.println("We reached adduser controller");

    }

그리고 jsp 파일에 내가 가지고있다.

<form:form id="adduser" method="post" action="/user/adduser" commandName="myData">

이것은 작동하지 않습니다. "/ adduser"와 404 페이지의 "/ user / adduser"에 대한 처리기 매핑이 없습니다.

하지만 .xml 파일에서 언급하면

  <url-pattern>/user/adduser</url-pattern>

그것은 작동하거나 내가 컨트롤러를 좋아한다면,

  @RequestMapping(value="/adduser", method={RequestMethod.POST})

또한 작동합니다. 페이지를 제출할 때 올바른 컨트롤러에 도달합니다.

@ReuqestMapping이 작동하는 방식에 혼란을 겪고 있습니다. 요청이 "/ user / adduser"와 같이 나타나면 올바른 클래스와 올바른 방법을 찾기 시작할 것입니다.

해결법

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

    1.Spring은 HttpServletRequest의 pathInfo 속성과 일치합니다.

    Spring은 HttpServletRequest의 pathInfo 속성과 일치합니다.

    web.xml이 / user / * 을 지정하면 pathInfo는 / user 접두어가 제거 된 경로가되므로 @RequestMapping은 / adduser 여야합니다.

    web.xml이 / user / adduser 을 지정하면 pathInfo는 전체 / user / adduser 경로가되므로 @RequestMapping이 전체 경로와 일치해야합니다.

    이것은 Spring에 의해 수행되는 것이 아니라 서블릿 컨테이너에 의해 수행되며 때때로 혼란 스러울 수 있습니다.

    @RequestMapping에서 와일드 카드를 사용하여이 문제를 완화 할 수 있습니다 (예 :

    @RequestMapping(value="**/adduser", method={RequestMethod.POST})
    
  2. from https://stackoverflow.com/questions/5740958/how-defaultannotationhandlermapping-works by cc-by-sa and MIT license