Spring MVC 3 - SessionAttributes, похоже, не работает - PullRequest
2 голосов
/ 23 августа 2011

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

  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(); 
}

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

Обновление: я выяснил, в чем проблема. Ответ опубликован ниже.

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

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

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

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

    @ NotNull private String name;

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

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

    private String name;

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

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

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

1 голос
/ 21 октября 2013

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

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

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

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

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

1 голос
/ 23 августа 2011

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

...