Как сбросить @ModelAttribute в Spring MVC после того, как он был обработан в контроллере? - PullRequest
4 голосов
/ 29 июля 2011

Я определил @ModelAttribute ("mymodel")

@ModelAttribute("mymodel")
MyModel mymodel() {
  MyModel mymodel = new MyModel();
  return mymodel;
 }


@RequestMapping(value = "/save", method = RequestMethod.POST)
public final void save(@ModelAttribute("mymodel") MyModel mymodel, 
                           final BindingResult binding,
    final HttpServletRequest request, 
    final ModelMap modelMap) throws Exception {
    modelService.save(mymodel);

            // try to reset the model --> doesn't work!!!
    myModel = new MyModel();
}

Проблема в том, что, хотя я сбрасываю модель в методе сохранения, если я перезагружаю страницу после операции сохранения и сохраняюво второй раз модель содержит все значения предыдущего myModel.

Как мне сбросить его после обработки?

Ответы [ 3 ]

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

Если я не ошибаюсь, это потому, что

myModel = new MyModel();

только сбрасывает ссылку в методе, точно так же, как получение MyModel из List<MyModel> и последующий вызов myModel = new MyModel(); не изменит элемент в списке, а только вашу локальную ссылку.

Скорее всего, вам нужно поместить новый MyModel () в модель или карту модели.

Здесь также может быть полезен шаблон перенаправления после публикации. У вас есть метод POST

return "redirect:originalpage.htm"

Это должно перезагрузить исходную страницу заново, а также будет означать, что если вы нажмете обновить, вы не будете повторно отправлять POST, сохраняя ваш объект дважды.

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

Я бы так не делал.

Попробуйте установить вашу модель в запросе на получение, например:

@RequestMapping(value = "/save", method = RequestMethod.GET)
public ModelAndView getSaveForm(ModelMap model) {
   model.addAttribute("mymodel", new MyModel());
   return new ModelAndView("newView", model);
}
0 голосов
/ 01 декабря 2012

Я столкнулся с аналогичной проблемой, когда возился с BookCatalog из Портлеты в действии .Мое решение было вручную сбросить его с помощью Model.addAttribute ().Например:

@RequestMapping(value = "/save", method = RequestMethod.POST)
public final void save(@ModelAttribute("mymodel") MyModel mymodel, 
   final BindingResult binding,
   Model model
   final HttpServletRequest request, 
   final ModelMap modelMap) throws Exception 
{
   modelService.save(mymodel);
   model.addAttrubute("mymodel", new MyModel());
}
...