2013-06-27 4 views
0

У меня есть атрибут сеанса, Myform содержит некоторые объекты Hibernate загружаются из БДНевозможно использовать DataBinder на объекте спящего режима в сеансе HTTP

@SessionAttributes("myForm") 

Из моего контроллера я получаю форму и обработать его, как этот

@RequestMapping(value = "/mymapping", method = RequestMethod.POST) 
@ResponseBody 
public final JsonValidationResponse validateContact(
     @ModelAttribute(value = "myForm") final MyForm myForm) { 

    return jsonValidator.getJsonErrors(myForm.getContact()); 

} 

Контактная класс имеет следующие проверки аннотацию

@Email 
private String email; 

следующего метода, имеющие проблемы

public final <T> JsonValidationResponse getJsonErrors(
      final T objectToValidate) { 

     //TEST CODE HERE 

     DataBinder binder = new DataBinder(objectToValidate); 
     binder.setValidator(validator); 
     binder.validate(); 
     return getJsonErrors(binder.getBindingResult()); 
    } 

Если я наблюдаю objectToValidate я вижу следующее, я думаю, это потому, что является объектом спящего режима и использует отложенную инициализацию.

com.mypackage.Contact _ $$ _ javassist_27 @ 1bdbbc0 [ContactId = 0, имя =, электронная почта =, Phone1 =, phone2 =, phone3 =, версия = 0, createDate =, ModifiedDate =, = идентификатор пользователя]

Если я бегу gettter на objectToValidate в //TEST CODE HERE, как показано ниже, я получить правильное значение, переданное в («пустышки», например), если после выполнения этого я наблюдаю «objectToValidate» снова показывает тот же результат, как и выше, даже хотя теперь он уже не должен быть Lazy инициализирован.

String email = (Contact)objectToValidate.getEmail(); 

Если создать фиктивный объект в //TEST CODE HERE, код работает отлично и связующие находит ошибку.

Contact dummy = new Contact(); 
    dummy.setEmail("dummy"); 

В основном binder.getBindingResult() не при использовании объекта спящего режима, и я не знаю, как это исправить. Похоже, что он не может разрешить свойства объекта hibernate, которые LAZY инициализированы (даже после вызова метода на объект и получения правильного результата).

ответ

0

Если вы используете ленивую инициализацию, тогда спящий режим должен использовать прокси. Это означает, что objectToValidate не является «реальным» объектом, он просто ведет себя как он.

В вашем случае проверка проводится на уровне поля. В конце концов вы аннотировали поле email не имущество getEmail().

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

+0

Это был ответ, ура. – jax