spring mvc 3 - SessionAttributes, похоже, не работает

Я пытался и пытался, но не могу понять, что здесь происходит.

  1. У меня есть простой контроллер, аннотированный с помощью @Controller
  2. У меня также есть аннотация для @SessionAttributes
  3. Я обрабатываю запрос GET и помещаю объект в модель.
  4. Когда я возвращаю POST из формы, я возвращаю только то, что заполнил пользователь. Я не верну полный объект.

Я новичок в SessionAttributes, но я думал, что это сохранило весь объект, и когда объект был прочитан обратно в методе с использованием @ModelAttribute, он будет объединен с объектом (то есть с объектом, форма которого изменилась). Однако я не вижу этого поведения.

Любая помощь приветствуется.

Вот соответствующие фрагменты кода:

@Controller
@RequestMapping("/user")
@SessionAttributes("user")
public class UserController 
{
      // ... 

@RequestMapping(value = "/{login}", method = RequestMethod.GET)
public String profile(Model model, @PathVariable("login") String login)
      {
           // ...
           model.addAttribute("user", user); 
           // ...
      }

@RequestMapping(value="/{login}", method = RequestMethod.POST)
public String saveProfile(@ModelAttribute("user") @Valid User user, BindingResult result, SessionStatus status)
{
     if (result.hasErrors())
           {
           return "user/index";
     }
           // ... 
           status.setComplete();
     return "redirect:/user/"+user.getLogin(); 
}

Вы видите что-нибудь, что я мог пропустить? Я потратил почти день, пытаясь понять это, и просто не могу. Любая помощь приветствуется.

Обновление: я понял, в чем проблема. Ответ размещен ниже.


person Azeem    schedule 23.08.2011    source источник


Ответы (3)


Я понял, что происходит после долгих трудов. Я надеюсь, что это сэкономит кому-то еще время.

Основная проблема здесь была двоякой:

  1. Сохраняемый в сеансе объект был украшен некоторыми аспектными обозначениями. Из-за этого значения атрибутов для объекта возвращались только соответствующими методами доступа get.
  2. У меня была проверка спящего режима (обратите внимание на аннотацию @Valid в методе, который обрабатывает POST). Аннотации валидатора были непосредственно в каждом поле (как показано ниже):

    @NotNull имя частной строки;

Вот как я это исправил.

  1. Только в целях тестирования я удалил @Valid и заметил, что хотя сами поля кажутся NULL, мы сохраняем правильные данные в нашем внутреннем хранилище. Это то, что подсказало мне основную причину этой проблемы.
  2. Я решил, что аннотации валидатора были причиной того, что я переместил нотацию валидатора, чтобы получить методы. Таким образом, код изменился следующим образом:

    частное строковое имя;

    @NotNull public String getName() {...}

  3. Я вернул аннотацию @Valid и убедился, что проверка больше не дает сбоев.

Надеюсь, это поможет кому-то и сэкономит им день работы. :)

person Azeem    schedule 23.08.2011

Я бы не ожидал, что spring объединит свойства формы session и form. Вы должны отделить пользователя, отправленного формой, и пользователя из сеанса.

person Ralph    schedule 23.08.2011

У меня был тот же вопрос, что и у Азима, и, поскольку он явно не подтвердил, что атрибут sessionattribute можно использовать для «объединения» исходного объекта поддержки формы с изменениями, опубликованными в сообщении, я хотел указать, что да, изменения из формы submit действительно сливаются с исходным объектом поддержки формы.

С этим подходом могут быть некоторые проблемы, как указано в

Spring MVC 3.0: как связать к постоянному объекту

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

Когда этот подход используется без использования аннотации @SessionAttributes("xxx") в классе, возвращаемый объект поддержки формы в основном является нулевым, за исключением тех членов, которые были специально отправлены формой. Это может сильно затруднить сохранение обновленных объектов, поскольку вам придется самостоятельно объединять новые обновления в исходный объект. Но с использованием атрибута sessionattribute полностью обновленный объект поддержки формы, предоставляемый после отправки, значительно упрощает сохранение графа объекта.

person Rudi    schedule 21.10.2013