我使用spring 3.1和hibernate validator 4.2。我觀察到,休眠驗證被調用兩次: 一個在控制器級別當我使用類似的方法:Hibernate bean驗證問題
@RequestMapping(method = RequestMethod.POST)
public String onSubmit(@Valid User user, BindingResult result) {....}
而當實體持續爲部分第2次:
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..)
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(..)
org.hibernate.action.EntityUpdateAction.preUpdate(..)
我相信,這使更有意義在控制器級別有效並顯示帶錯誤消息的錯誤頁面。無論如何,在流程中做兩次相同的驗證並不好。 我發現在休眠文檔中可以通過在休眠配置中將hibernate.validator.autoregister_listeners
設置爲false來關閉它,但不建議這樣做。
那麼什麼是驗證的推薦方法?同樣在我的特殊情況下,第二次驗證會導致麻煩,因爲我有一個字段'confirmPassword
',這是用戶提交表單時所需的驗證字段,但在表格中並不需要,所以無論何時我必須保存,更新用戶,我必須不必要地設置confirmPassword
字段通過驗證。
因此,你建議我應該有兩個pojo bean一個用戶窗體進行視圖驗證和其他用戶保存到數據庫。而且我在兩者上都有驗證註釋。其中很常見的例子是,一個單獨的bean既用於jsp form也用於保存到數據庫,從而節省了用於將字段從一個bean複製到另一個的代碼。這是一種不好的做法嗎? – user1694519
..根據我的經驗,並非(總是)有可能爲視圖和數據庫創建一個類,考慮到在視圖中並不罕見的是來自許多持久實體的當前字段(我稱之爲域視圖上的'視圖' ),而且(和你的情況一樣,confirmPassword)有些字段沒有持久性。在我的例子中,有一個bean(userForm)持有持久化類bean(有時候指的是更持久的bean):在我的例子中,confirmPassword/confirmEmail位於'表單bean'中,並且字段密碼/電子郵件位於「實體」(永久性bean)中。 – obe6
嗯,是的,你說的話對於使用兩類物品VO和DTO來說是非常有意義的。我覺得代碼中會有很多語句,如'user.setEmail(userForm.getEmail())',這看起來不太好。據我記得,即使春天roo生成代碼使用相同的類視圖和分貝。 – user1694519