Как в Spring MVC сопоставить вложенные URL-адреса, такие как / settings /, / settings / users / и / settings / users / delete? - PullRequest
4 голосов
/ 29 июня 2011

В Spring 3 MVC у меня есть контроллер, который я называю SettingsController, и у него есть такие методы, как displayUsers () для отображения списка пользователей, saveUser () и deleteUser (). SettingsContoller также контролирует роли и другие вещи.

Я бы хотел использовать маршрутизацию URL таким образом, чтобы / settings / users вызывал displayUsers (), / settings / users / save вызывал saveUser (), а / settings / users / delete вызывал бы deleteUser ().

Мой код указан ниже, и я получаю сообщение об ошибке, следующее за кодом. Что я делаю неправильно? Спасибо!

@Controller
@RequestMapping("/settings")
public class SettingsController {

    @Transactional
    @RequestMapping(value = {"/users/save"}, method = {RequestMethod.POST})
    public ModelAndView saveUser(details removed){
        //details removed
    }

    @RequestMapping(value = {"/users/delete"}, method = {RequestMethod.POST})
    public ModelAndView deleteUser(details removed){
       //details removed
    }

    @RequestMapping(value = {"/users"}, method = RequestMethod.GET)
    public ModelAndView settingsUsers(details removed){
      //details removed
    }

}

Ошибка:

HTTP ERROR: 500

Could not resolve view with name 'settings/users/delete' in servlet with name 'spring'
RequestURI=/das-portal/srv/settings/users/delete

Caused by:

javax.servlet.ServletException: Could not resolve view with name 'settings/users/delete' in servlet with name 'spring'
    at        org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1029)
...

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Мне кажется, вы правильно настроили свой контроллер.Как вы указали, проблема может заключаться в том, как Spring анализирует аннотации при запуске.

Как вы настроили Sprint для анализа аннотаций, таких как @Controller?Вы явно настроили какой-либо HandlerMapping?Если вы используете <context:component-scan>, то он регистрирует для вас DefaultAnnotationHandlerMapping .

Хорошая новость заключается в том, что вы можете объединить несколько классов отображения обработчиков вместе .DispatcherServlet будет проверять каждый из них в порядке, указанном вами в свойстве порядка обработчиков, отображающих bean-компоненты (другими словами, используйте свойство order, чтобы указать приоритет ваших обработчиков).

Итак, добавьте <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> в вашу конфигурацию и установите его свойство порядка соответствующим образом.

1 голос
/ 29 июня 2011

Как насчет использования только одного режима проверки метода?

@RequestMapping(value = "/users/{action}", method = RequestMethod.POST)
public String userAction(@PathVariable String action, ...) {
  if (mode.equals("save")) {
      //your save code here
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...