Связывание данных аннотированных параметров @ModelAttribute

У меня есть аннотированный контроллер Spring 2.5, в котором у меня есть метод, аннотированный с помощью @RequestMapping (method = RequestMethod.GET), который выполняет некоторую логику для заполнения модели.

У меня также есть метод, помеченный @RequestMapping (method = RequestMethod.POST), который выполняет запрос. Этот метод имеет аннотированный параметр @ModelAttribute, который содержит мою собственную форму pojo, назовем ее MyForm. У меня также есть метод инициализации для MyForm, также аннотированный @ModelAttrribute. Пока все работает, как ожидалось: при запросе POST данные формы привязываются к MyForm, и я могу их обработать.

Проблема в том, что я хочу иметь возможность предварительно заполнить форму, передав параметры запроса (GET). Поскольку у меня есть метод @ModelAttribute для MyForm, я получаю экземпляр MyForm в своей модели, но он не заполняется, если я специально не использую его в качестве параметра для моего метода GET.

Почему я должен это делать, можно ли по-другому принудительно привязать данные к моей форме для запроса GET? Теперь я просто передаю параметр, но поскольку он уже присутствует в модели, мне не нужно с ним ничего делать, что приводит к уродливому неиспользуемому параметру метода.

[Изменить: несколько примеров кода для иллюстрации]

Контроллер, который не заполняет форму при получении запроса:

@Controller
public class MyController {

  @ModelAttribute("myForm")
  public MyForm createForm() {
    return new MyForm();
  }

  @RequestMapping(method=RequestMethod.GET)
  public void handlePage(Model model) {
    //Do some stuff to populate the model....
  }

  @RequestMapping(method=RequestMethod.POST)
  public void processForm(@ModelAttribute("myForm") MyForm myForm) {
    //Process the form
  }
}

Когда я изменяю сигнатуру метода handlePage, он заполняется при получении запроса ...

@RequestMapping(method=RequestMethod.GET)
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) {
  //Do some stuff to populate the model....
}

person Jaap Coomans    schedule 26.05.2009    source источник
comment
Когда вы говорите, что у вас есть собственная форма pojo, вы имеете в виду просто некоторый объект домена, верно? (в отличие от некоторой специальной реализации пружинной формы.) Также ваше представление является стандартным JSP?   -  person Alex Beardsley    schedule 02.06.2009
comment
Ага, ты прав. Просто какой-то предметный объект. Мое представление не является JSP, но я избавлю вас от деталей реализации представления (не моего собственного), потому что я могу написать книгу только об этом ...   -  person Jaap Coomans    schedule 02.06.2009


Ответы (1)


Метод с @ModelAttribute может иметь любые аргументы, которые поддерживает @RequestMapping, поэтому, например, вы можете добавить сколько угодно @RequestParam аргументов для заполнения вашего командного объекта или даже самого HTTP-запроса. Я не уверен, можно ли таким же образом получить экземпляр связывателя данных или нет.

Снова читая документацию, я думаю, что идея состоит в том, что предварительное заполнение в методе @ModelAttribute будет управляться базой данных, поэтому, вероятно, не происходит никакого связывания данных без добавления @ModelAttribute в качестве аргумента метода @RequestMapping.

person Corey    schedule 29.05.2009
comment
Нет, связыватель данных доступен только в аннотированном методе @InitBinder. Я тоже об этом подумал ... к сожалению, это не работает :( Теперь я просто исправил это, передав атрибут модели и аннотируя его с помощью @SuppressWarnings (не используется). - person Jaap Coomans; 29.05.2009