Как работает DefaultAnnotationHandlerMapping - PullRequest
5 голосов
/ 21 апреля 2011

Я не понимаю, как работает 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 Ответ

9 голосов
/ 21 апреля 2011

Spring будет совпадать со свойством pathInfo HttpServletRequest.

Если ваш web.xml указывает <url-pattern>/user/*</url-pattern>, тогда pathInfo будет путем с удаленным префиксом /user, поэтому @RequestMapping должно быть /adduser.

Если web.xml указывает <url-pattern>/user/adduser</url-pattern>, то pathInfo будет полным /user/adduser путем, поэтому @RequestMapping должен соответствовать этому.

Это делается не Spring, а контейнером сервлетов, и иногда это может сбивать с толку.

Вы можете смягчить это, используя подстановочные знаки в @RequestMapping, например,

@RequestMapping(value="**/adduser", method={RequestMethod.POST})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...