2010-01-20 91 views
0

我使用@AssertTrue註釋來確保執行設置某些默認值的方法(始終返回true)。這些設置值被驗證爲@NotEmpty(這些是字符串)。所以我需要保證用@AssertTrue註釋的方法嚴格執行之前,這些字段用@NotEmpty註釋。可以使用Hibernate Validator設置驗證順序嗎?

簡化代碼示例(不包括休眠註釋):

public class MyClass { 
    @NotEmpty 
    private String myField = null; 

    @SuppressWarnings("unused") 
    @AssertTrue 
    private boolean fillDefaultValues() { 

     if (this.myField == null) { 
     this.myField = "default value"; 
     } 

     return true; 
    } 
} 

回答

1

這我看來,像一個黑客。原因有二:

  • 你總是返回true,並斷言其爲
  • 您所期望的框架來訪問,爲了執行初始化代碼,按照特定的順序驗證您的豆執行初始化代碼的唯一目的

共同點是「初始化代碼」。爲了實現你想要的,你可以在驗證發生之前註冊一個監聽器並執行初始化方法。 Here's hibernate-validator的文檔 - 它告訴你關於事件監聽器的信息。

您也可以在服務層中手動設置默認值(因爲您似乎正在使用貧血數據模型)。因爲這看起來像一個業務邏輯,所以最好在服務方法中,在對象被持久化之前。

0

最後我解決了我的問題。

調試驗證器堆棧跟蹤,我看到它首先處理beanValidators,然後處理memberValidators。所以我唯一需要做的就是在類約束中定義我的初始化代碼。

我已經定義了一個新的類註解,其中,根據收到的pojo的類型,我設置了默認值。

我已經驗證,此代碼比之前任何其他(成員)constarint執行,像@NotEmpty等

+0

雖然我沒有看過javax.validation規範,這種行爲可能是實現特定的,即使你在這裏成功了,在下次升級時,如果在規範中沒有定義它,這種行爲可能會改變。正如我所說,這不是執行初始化的正確方法。 – Bozho

+0

好的,也許這不是正確的方法,但是,什麼是正確的方法?由於我不知道這種方式,所以我使用這個,因爲它的工作原理。 – Alberthoven

+0

在我的回答中,我發佈了一個鏈接到事件監聽器 - 檢查出來。 – Bozho

相關問題