У меня продолжаются проблемы с настройкой Spring Controller для сопоставления с определенными URL-адресами, и у меня это довольно простой сценарий, который, я думаю, должен работать:
Я настраиваю свой класс Controller с помощью аннотаций, и он выглядит следующим образом:
@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
}
}
Дальнейшая конфигурация контроллера отсутствует, у меня просто есть конфигурация <mvc:annotation-driven/>
и конфигурация <context:component-scan>..
в моей конфигурации 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 с помощью аннотаций, но он работает неправильно - кто-нибудь сталкивался с этим или видит какие-либо явные ошибки на моя часть?
UPDATE
Я добился определенного прогресса в своих расследованиях.
В моем файле web.xml я определяю отображение сервлета следующим образом:
<servlet-mapping>
<servlet-name>microblog</servlet-name>
<url-pattern>/question/*</url-pattern>
</servlet-mapping>
Если я удаляю это отображение сервлета (у меня все еще есть отображение сервлета, которое отображает все .html
в один и тот же сервлет) и меняю URL, который я использую, на /question/list.html
, тогда это работает (также я меняю уровень метода отображение аннотации @RequestMapping
для моего метода list()
в контроллере вопросов на /list.html
).
В итоге:
У меня есть отображение сервлета /question
в веб-контексте
У меня есть еще одно сопоставление /question
с QuestionController
У меня есть сопоставление уровня метода для моего метода списка /list
Теперь я не хочу, чтобы мои URL заканчивались на .html для этих случаев - кто-нибудь знает, как я могу обойти эту проблему? Кажется, что, возможно, отображение сервлета удаляет из URL-адреса совпадающую строку /question
(следовательно, /question/list
не работает, но /question/question/list
работает)