2013-06-27 41 views
0

我有一個會話屬性休眠對象上不能使用DataBinder的,myForm會包含來自DB在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()); 

} 

Contact類具有以下的驗證註解

@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我看到下面,我想這是因爲它是一個Hibernate對象,並使用暫緩初始化。

com.mypackage.Contact _ _ $$ @ javassist_27 1bdbbc0 [使用ContactID = 0,名字=,電子郵件=,= PHONE1,PHONE2 =,電話3 =,版本= 0,CREATEDATE =,modifiedDate =,用戶id =]

如果我在//TEST CODE HERE像下面運行objectToValidate一個gettter,我獲得(例如「虛擬」)傳遞正確的值,如果運行這個後,我看到「objectToValidate」它再次顯示了同樣的結果如上甚至儘管現在應該不再使用Lazy初始化了。

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

如果我在創建一個//TEST CODE HERE虛擬對象,代碼工作正常和粘結劑發現錯誤。

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

基本上,binder.getBindingResult()不使用hibernate對象時,我不知道如何解決它。看起來,它無法解析LAZY初始化的hibernate對象屬性(即使在對象上調用方法並獲得正確結果後)。

回答

0

如果您使用延遲初始化,那麼hibernate必須使用代理。這意味着objectToValidate不是「真正的」對象,它只是表現得像它。

在您的案例中,驗證發生在現場級別。畢竟你註釋了字段email而不是屬性getEmail()

雖然我不能說你的情況究竟發生了什麼,但我可以說這與訪問代理和直接訪問字段之間的差異有關。我建議要麼註釋該屬性,要麼不使用延遲初始化。

+0

這就是答案,歡呼聲。 – jax