2011-08-23 3 views
1

Я пробовал и пытался, но не могу понять, что здесь происходит.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(); 
} 

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

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

ответ

3

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

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

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

    @NotNull private Название строки;

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

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

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

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

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

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

1

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

0

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

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

Spring MVC 3.0: How do I bind to a persistent object

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

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

Смежные вопросы