В Spring MVC как я могу заставить @RequestMapping работать? - PullRequest
0 голосов
/ 19 июля 2011

В Spring 3 MVC у меня есть контроллер, который я вызываю RolesController, и у него есть такие методы, как displayRoles () для отображения списка ролей, saveRole () и deleteRole ().

В настоящее время я успешно использую аннотации @RequestMapping для маршрутизации / настройки / роли / для вызова метода displayRoles (), / settings / role / save / для вызова метода saveRole () и т. Д.

Мой код ниже, и он работает.

@Controller
public class RolesController {

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

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

    @RequestMapping(value = {"settings/roles"}, method = RequestMethod.GET)
    public ModelAndView displayRoles(details removed){
      //details removed
    }

}

Есть 2 проблемы, которые мне не удалось исправить:

  1. Мне не удалось сопоставить родительский каталог /settings/ для вызова метода displayRoles (). Если я изменил отображение метода displayRoles на @RequestMapping(value = {"settings","settings/","settings/roles"}, method = RequestMethod.GET), а затем перестроил и перешел на / Настройки в URL, я получаю ошибку 404. Почему я не могу сопоставить родительскую папку «настройки»?
  2. Завершающие косые черты в URL, по-видимому, необходимы. Например, переход к настройкам / ролям / работам, но посещение настроек / ролей приводит к ошибке 404 Страница не найдена.

Что я делаю не так? Спасибо! -Ryan <Ч /> Постскриптум Вот дополнительная информация ... если это поможет:

В моем файле applicationContext-mvc.xml у меня есть (среди прочего код):

<!-- Maps request paths to @Controller classes; e.g. a path of /login looks for a controller named LoginController -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
    <property name="order" value="1" />
</bean>      
<!-- If no @Controller match, look for @RequestMapping match-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="2" />
    <property name="defaultHandler">
        <!-- If no @RequestMapping match, map path to a view to render; e.g. the "/intro" path would map to the view named "intro" -->
        <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
    </property>
</bean>

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Для проблемы с косой чертой это может быть деталь версии: существует ряд ошибок косой черты (см. http://jira.springframework.org/browse/SPR-7064 и https://issues.springsource.org/browse/SPR-5636), которые помечены как исправленные в Spring 3.0.3 ивыше.

Для решения проблемы отображения /settings вам может потребоваться сделать что-то вроде @Bill did:

@Controller
@RequestMapping(value = {"/settings"})
public class RolesController {

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

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

    @RequestMapping(value = {"/","/roles"}, method = RequestMethod.GET)
    public ModelAndView displayRoles(details removed){
      //details removed
    }
}
1 голос
/ 02 декабря 2014

Как упомянуто выше, возможно, была ошибка с более старыми версиями, но так как никакой ответ, кажется, не был принят, это то, что мне подходит ...

Это помогло мне создать indexAction () с необязательной косой чертой, которая служит действием по умолчанию для данного контроллера. В этом случае displayRoles () может использоваться по умолчанию:

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

Если / settings и / settings / role должны относиться к одному и тому же методу, то что-то вроде этого решает проблему:

@Controller
@RequestMapping(value = "/settings")
public class RolesController {

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

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

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

Прекрасно работает с Spring 4.0.7.

0 голосов
/ 19 июля 2011

Попробуйте следующее ...

    @Controller
    @RequestMapping("/settings/roles")
    public class RolesController {

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