Конфигурация Spring MVC Controller - смешивание аннотаций и XML @PathVariable - PullRequest
1 голос
/ 05 августа 2011

Я занимаюсь разработкой веб-приложения с использованием среды Spring MVC (v3).

В настоящее время у меня определено несколько классов контроллеров - я создал их, расширив MultiActionController, а затем в своем веб-конфигурации mvc XML определил bean-компоненты и сопоставления URL-адресов:

QuestionController.java:

public class QuestionController extends MultiActionController implements InitializingBean 
{

webmvc-config.xml

<bean id="questionController" class="com.tmm.enterprise.microblog.controller.QuestionController"></bean>
...
    <bean id="fullHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="alwaysUseFullPath" value="true" />
        <property name="mappings">
            <props>
                <prop key="/question/**">questionController</prop>
            </props>
        </property>
    </bean>  

Это прекрасно работает, я определяю методы в моем контроллере, совпадающие с вызываемыми URL, и все работает правильно (например, у меня есть метод list(..), который корректно выполняется, когда я перехожу к /question/list).

Однако для этого конкретного контроллера я хочу использовать опцию @PathVariable в Spring, чтобы разрешить переменные URL-адреса (например, я хочу details(..) метод, который при вызове /question/detail/9999 - где 9999 идентификатор вопроса, метод выполняется). Я попытался использовать это следующим образом:

QuestionController.java:

@RequestMapping("/detail/{questionId}")
public ModelAndView detail(@PathVariable("questionId") long questionId, HttpServletRequest request, HttpServletResponse response) throws Exception{

Тем не менее, я получаю сообщение об ошибке при запуске выше и получаю:

Не удалось найти @PathVariable [questionId] в @RequestMapping

Кто-нибудь сталкивался с этим раньше? Можно ли смешивать аннотации RequestMapping с существующим отображением URL, настроенным для XML?

1 Ответ

4 голосов
/ 05 августа 2011

Это комментарий от DefaultAnnotationHandlerMapping класса, если я правильно читаю комментарий, если вы добавите @RequestMapping вверху вашего QuestionController.java, это может решить вашу проблему

Аннотированные контроллеры обычно помечаются стереотипом {@link Controller} на уровне типа. Это не обязательно, когда {@link RequestMapping} применяется на уровне типа (поскольку такой обработчик обычно реализует {@link org.springframework.web.servlet.mvc.Controller} интерфейс). Тем не мение, {@ link Controller} требуется для обнаружения {@ link RequestMapping} аннотаций на уровне метода , если {@link RequestMapping} отсутствует на уровне type .

EDIT

Вы можете сделать что-то подобное, переместить часть URI / question наверх и оставить детализация на уровне метода

@RequestMapping("/question")
public class QuestionController
{
  @RequestMapping("/detail/{questionId}")
  public ModelAndView detail(@PathVariable("questionId") long questionId,    HttpServletRequest request, HttpServletResponse response) throws Exception{

}
...