Java - Spring 3.0 MVC и @ModelAttribute - PullRequest
       14

Java - Spring 3.0 MVC и @ModelAttribute

3 голосов
/ 18 ноября 2011

Мне нужны пояснения по поводу Spring 3.0 MVC и параметра аннотированного метода @ModelAttribute.У меня есть контроллер, который выглядит так:

RequestMapping(value = "/home")
@Controller
public class MyController {

 @RequestMapping(method = RequestMethod.GET)
 public ModelAndView foo() {

               // do something
 }

@RequestMapping(method = RequestMethod.POST)
public ModelAndView bar(
        @ModelAttribute("barCommand") SomeObject obj) {

                    // do sometihng with obj and data sent from the form
}


}

, и на моем home.jsp у меня есть такая форма, которая отправляет его данные в метод RequestMethod.POST MyController

<form:form  action="home"  commandName="barCommband">

</form:form

Теперь, если я пытаюсь получить доступ к home.jsp, я получаю следующее исключение:

java.lang.IllegalStateException:
Neither BindingResult nor plain target object for bean name 'barCommand' available as  request attribute

Чтобы решить эту проблему, я обнаружил, что мне нужно добавить параметр

@ModelAttribute("barCommand") SomeObject obj 

в Запрос.GET метод MyController, даже если я не буду использовать obj в этом методе.И, например, если добавить в home.jsp другую форму с другим именем команды, например:

<form:form  action="home/doSomething"  commandName="anotherCommand">

</form:form

, мне также нужно добавить этот параметр в RequestMethod.GET, который теперь будет выглядеть следующим образом:

@RequestMapping(method = RequestMethod.GET)
 public ModelAndView foo( @ModelAttribute("barCommand") SomeObject obj1,
  @ModelAttribute("anotherCommand") AnotherObj obj2) {

               // do something
 }

или я получаю такое же исключение.Я спрашиваю, является ли это нормальным поведением Spring 3 MVC или я делаю что-то не так.И почему мне нужно поместить все параметры @ModelAttribute в метод RequestMethod.GET?

Заранее спасибо за помощь

Стефано

1 Ответ

3 голосов
/ 18 ноября 2011

Здесь - ссылка на пружину MVC. Кратко просмотрел и нашел 2 подхода:

  1. @ InitBinder
  2. @ ModelAttribute ("bean_name") с методом.

Сначала вы можете настроить привязку данных и, таким образом, создавать объекты команд на лету. Второй позволяет вам аннотировать метод и предварительно заполнять атрибуты модели этим именем:

@ModelAttribute("bean_name")
public Collection<PetType> populatePetTypes() {
    return this.clinic.getPetTypes();
} 

Я надеюсь, что атрибуты модели будут заполнены именем 'bean_name', если оно будет нулевым.

...