2009-04-15 40 views
3

如果我想使用Hibernate驗證器驗證某個Java類的某些字段。 現在我希望我的用戶能夠在運行時配置哪些驗證發生。如何在運行時更改註釋/ Hibernate驗證規則?

例如:

public class MyPojo { 
    ... 

    @NotEmpty 
    String void getMyField() { 
     ... 
    } 

    ... 
} 

比方說,我想刪除NotEmpty支票或與EmailCreditCardNumber取代它,我該怎麼辦呢?它甚至有可能嗎?我想這涉及到在運行時更改註釋...

回答

2

你不能這樣做。

以下是我通過Hibernate Validator獲得更多動態驗證所做的工作。

  1. 延長ClassValidator類。
  2. 重寫getInvalidVaues(Object myObj)方法。首先,請撥打super.getInvalidValues(myObj),然後將鉤子添加到您的自定義驗證中。
  3. 實例化您的自定義驗證程序並致電getInvalidValues進行驗證。任何hibernate註釋的驗證都會在這個時候啓動,並且您的自定義動態驗證(任何不受註釋支持的內容)也將啓動。

例子:

public class MyObjectValidator extends ClassValidator<MyObject> 
{ 
    public MyObjectValidator() 
    { 
     super(MyObject.class); 
    } 

    public InvalidValue[] getInvalidValues(MyObject myObj) 
    { 
     List<InvalidValue> invalids = new ArrayList<InvalidValue>(); 
     invalids.addAll(Arrays.asList(super.getInvalidValues(myObj))); 

     // add custom validations here 
     invalids.addAll(validateDynamicStuff(myObj)); 

     InvalidValue[] results = new InvalidValue[invalids.size()]; 
     return invalids.toArray(results); 
    } 

    private List<InvalidValue> validateDynamicStuff(MyObject myObj) 
    { 
     // ... whatever validations you want ... 
    } 

} 

所以您的自定義驗證代碼包含這樣的邏輯「做這個驗證,如果用戶配置的它,否則做一個」,等等。你可能會或可能無法以利用相同的代碼來支持hibernate驗證,但無論如何,您正在做的是更多地涉及hibernate驗證器的'正常'用例。

0

我不認爲你能夠刪除或更改註釋,它是類定義的一部分。你可以建立一個新的類,這在運行時是可能的,但有一點涉及。 Hibernate可能支持對驗證的編程訪問,並允許您覆蓋註釋,但我不太瞭解API。 Hibernate會自己創建一些運行時類......這可能是一個很好的地方,可以學習如何執行它,如果你感興趣的話。

+0

覆蓋註解_wont_工作。自定義hibernate驗證器的一種方法是編寫自己的註釋,但這對於DR正在嘗試執行的操作不起作用,b/c在運行時不能訪問動態值,除了註釋是字段附屬於。註釋中的任何輸入都必須是常量。對於可行的事情,請查看下面的答案。 – 2009-04-23 12:29:23