Spring MVC Проблема сопоставления URL-адресов с контроллерами - PullRequest
0 голосов
/ 08 августа 2011

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

У меня есть два контроллера: QuestionController и TodoController - оба расширяют MultiActionController и у обоих определен метод list().

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

<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/todo/*</url-pattern>
</servlet-mapping>

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

Следующим шагом я определил конкретные сопоставления контроллеров в моей конфигурации mvc следующим образом:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">        
    <property name="mappings">
        <props>
            <prop key="/todo/**">todoController</prop>
            <prop key="/question/**">questionController</prop>
        </props>
    </property>

С помощьюВыше сценария все работает нормально, я могу перейти к /question/list, и я вижу ожидаемые вопросы, и я могу перейти к /todo/list, и я вижу ожидаемые To-Dos в списке.

Теперь я хотелдобавьте метод к QuestionController, который использует @PathVariable (поэтому у меня может быть один метод, который обрабатывает все URL, такие как: /question/detail/[QUESTION_ID]).Чтобы добиться этого, я добавил аннотацию @RequestMapping к методу detail() в моем контроллере вопросов - чтобы сделать эту работу, мне нужно было добавить аннотацию @Controller к моему классу QuestionController, а также применимую аннотацию @RequestMapping к моему оригиналу list() method.

Опять же, все это, казалось, работало идеально - я все еще мог получить доступ к странице списка вопросов через /question/list, и переход к /question/detail/123 позволил мне просмотреть подробную страницу, которую я ожидал получить Вопрос123. Однако, когда я теперь перехожу к /todo/list, мне предоставляется страница, которую я ожидал бы для /question/list, и журналы показывают следующее:

2011-08-08 15:23:38,098 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'app' determining Last-Modified value for [/app/todo/list]
2011-08-08 15:23:38,098 [http-8080-3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapping [/list] to handler 'com.tmm.enterprise.controller.QuestionController@1ef4b'
2011-08-08 15:23:38,133 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - Last-Modified value for [/app/todo/list] is: -1
2011-08-08 15:23:38,133 [http-8080-3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'app' processing GET request for [/app/todo/list]
2011-08-08 15:23:38,133 [http-8080-3] DEBUG org.springframework.web.bind.annotation.support.HandlerMethodInvoker - Invoking request handler method: public org.springframework.web.servlet.ModelAndView com.tmm.enterprise.controller.QuestionController.list(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception

Как вы можете видеть - по какой-то причинеКонтроллер вопросов теперь выбирается, несмотря на то, что URL-адрес совпадает с отображением для TodoController.

Есть идеи?


UPDATE

Два контроллераопределены следующим образом:

QuestionController.java

@Controller
public class QuestionController extends MultiActionController implements InitializingBean 
{

    @RequestMapping("/list")
    public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception{
        //Display List view for questions
    }

    @RequestMapping("/detail/{questionId}")
    public ModelAndView detail(@PathVariable("questionId") long questionId, HttpServletRequest request, HttpServletResponse response) throws Exception{
        //Display Detailed Question View for questionId...
    }
}

ToDoController.java

public class TodoController extends MultiActionController implements InitializingBean 
{

    @Transactional
    public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception{
        //Display list of Todos
    }

}

Как видите, я только добавил аннотации oв контроллере вопросов, а не в контроллере задач.Я также не определил явное сопоставление URL-адреса с контроллером вопросов в аннотациях (я знаю, что мог бы поставить @RequestMapping("/question") на уровне класса - но так как это уже определено в конфигурации, я также не добавил его здесь., Если я определю это здесь также, тогда я получу ошибку ResourceNotFound, но если я перейду к /question/question/list, тогда он загрузится правильно)

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