Spring MVC - отображение контроллера на URL с использованием аннотаций - PullRequest
5 голосов
/ 09 августа 2011

У меня продолжаются проблемы с настройкой 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).

В итоге:

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

  2. У меня есть еще одно сопоставление /question с QuestionController

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

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

Ответы [ 3 ]

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

комплект

<url-pattern>/</url-pattern> 

для URL без HTML и использовать

<mvc:resources mapping="/resources/**" location="/resources/" />

для таких ресурсов, как .css, .jpg и т. Д.

2 голосов
/ 09 августа 2011

Вам не нужен / ** в отображении вашего контроллера.

Отображение на @RequestMapping(value = "/question") приведет вас к этому контроллеру.

/list будет добавлено к /question.

Когда вы добавляете /**, как у вас, вы говорите ему искать базовый путь вопроса, за которым следует что-нибудь, а затем добавьте /list в конец.

Надеюсь, это поможет.

0 голосов
/ 06 декабря 2013

Я также сталкиваюсь с этой проблемой, но не разрабатываю, просто вызову Rest API, а затем ошибку: "org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException: не найден соответствующий метод-обработчик для запроса сервлета ....."

Я решил эту проблему, добавив «Accept: application / json» в заголовок запроса в клиентском инструменте Rest.Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...