Я занимаюсь разработкой веб-приложения с использованием 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
, тогда он загрузится правильно)