2013-07-15 45 views
0

JEE6教程(http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html)建議JSR-303/Bean驗證應該用於驗證輸入 - 至少這是我對它的解釋。儘管如此,一些Bean Validation註解(例如@NotNull)在界面驗證級別上可能不是有用的,而是在預先持久化級別上不是有用的。我應該依賴數據庫進行Hibernate屬性驗證嗎?

例如,請考慮下面的實體:

public class Registry { 

    @NotNull 
    String userName; 

    @NotNull 
    Date createdAt; 
} 

在這種情況下,有哪個用戶名是由用戶自己填寫的表單。但我不希望用戶知道這個註冊表的創建日期。我希望我的後端將其設置爲服務器的當前日期。

所以,我通常會將此對象綁定到頁面上的表單,並使用@Valid來執行JSR-303驗證。但事情是:我沒有通過Bean Validation驗證「createdAt」,我希望只有在實體將被Hibernate持久化時才能驗證它。但是,通過Bean驗證,這兩個屬性都通過表單請求進行驗證。

如何解決這個問題? JSR-303應該在這種情況下工作嗎?我應該依賴數據庫可空字段驗證「createdAt」屬性嗎?

這個職位幾乎是同一個問題,但我還沒有找到任何答案有兩種:Validation where to organize in web app for more efficient way

回答

1

將您的約束不同validation groups並在表單提交驗證一組(例如,默認組)和在預持續(例如另一種驗證組PrePersist:期間使用

@interface PrePersist {} 

public class Registry { 

    @NotNull 
    String userName; 

    @NotNull(groups = PrePersist.class) 
    Date createdAt; 
} 

指定組預堅持這樣在你的persistence.xml:

<persistence ...> 
    <persistence-unit ...> 
     ... 
     <properties> 
      <property 
       name="javax.persistence.validation.group.pre-persist" 
       value="com.example.PrePersist"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

酷!我會嘗試的!謝謝! – felipecao

相關問題