Spring MVC - Сопоставление контроллера с URL-адресами с использованием аннотаций

У меня постоянные проблемы с настройкой моего Spring Controller для сопоставления с определенными URL-адресами, и у меня есть довольно простой сценарий, который, как мне кажется, должен работать:

Я настраиваю свой контроллер класс с использованием аннотаций, и он выглядит следующим образом:

@Controller
@RequestMapping(value = "/question/**")
public class QuestionController 
{

    /**
     * Method to build users questions list
     * 
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping("/list")
    public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception{
        //Display Questions List
    }
}

Дальнейшей конфигурации контроллера нет, у меня просто конфигурация и .. конфигурации в моей конфигурации webmvc, поэтому контроллер определяется автоматически.

Теперь, когда я перехожу к / question / list , приложения не могут найти ресурс, и я получаю ResourceNotFound ошибка. Однако, если я перейду к / question / question / list , тогда приложение загрузит страницу, которую я ожидал правильно.

Любые идеи, почему это указывает на метод, используя / question / question / list ?


После этого я попытался добавить конфигурацию в мою конфигурацию webmvc, чтобы заставить все RequestMappings использовать параметры alwaysUseFullPath = true, я сделал это следующим образом:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:order="3">
        <property name="alwaysUseFullPath" value="true" />
    </bean>

На этот раз, когда Я перехожу к / question / list, он по-прежнему не может загрузить правильную страницу, но журналы показывают, что Spring, по крайней мере, определяет правильный контроллер, но просто не может найти метод (до того, как он даже не нашел контроллер на основе URL-адреса ):

2011-08-09 18:02:27,885 [http-8080-3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Matching patterns for request [/question/list] are [/question/**/list/, /question/**/list, /question/**/, /question/**]
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapping [/question/list] to handler 'com.tmm.enterprise.microblog.controller.QuestionController@143c423'
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/microblog/question/list] is: -1
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'microblog' processing GET request for [/microblog/question/list]
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.handler.SimpleMappingExceptionResolver - Resolving exception from handler [com.tmm.enterprise.microblog.controller.QuestionController@143c423]: org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: No matching handler method found for servlet request: path '/list', method 'GET', parameters map[[empty]]
2011-08-09 18:02:27,886 [http-8080-3] DEBUG org.springframework.web.servlet.handler.SimpleMappingExceptionResolver - Resolving to view 'resourceNotFound' for exception of type [org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException], based on exception mapping [.NoSuchRequestHandlingMethodException]
2011-08-09 18:02:27,887 [http-8080-3] DEBUG org.springframework.web.servlet.handler.SimpleMappingExceptionResolver - Exposing Exception as model attribute 'exception'

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


ОБНОВЛЕНИЕ

Я добился некоторых успехов в своих исследованиях.

В моем web.xml я определяю отображение сервлета следующим образом:

<servlet-mapping>
        <servlet-name>microblog</servlet-name>
        <url-pattern>/question/*</url-pattern>
    </servlet-mapping>

Если я удалю это отображение сервлета (у меня все еще есть отображение сервлета, которое отображает все .html на тот же сервлет) и измените URL-адрес, который я использую, на /question/list.html , тогда он работает (также я меняю отображение уровня метода аннотации @RequestMapping в моем списке () в контроллере вопросов в /list.html ).

В итоге:

  1. У меня есть отображение сервлета / question в веб-контекст

  2. I есть другое сопоставление / question с QuestionController

  3. У меня есть сопоставление уровня метода для моего метода списка / list

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

5
задан rhinds 10 August 2011 в 08:18
поделиться