2013-07-01 73 views
2

我有兩個屬性,像下面一個自定義字段的註釋類:如何驗證自定義註釋屬性?

public @interface Field { 
    String type(); 
    int order(); 
} 

我想驗證order,它不應該是一個負值,不應該重複,例如:

class User { 
    @Field(uiType = "TEXT", order = 1) 
    private String fName; 

    @Field(uiType = "TEXT", order = 2) 
    private String lName; 
} 

任何人都可以幫我做到嗎?

+0

你是否試圖確保變量在反射過程中以特定順序返回?請提供有關問題的更多信息。 –

+0

使用Java的[apt](http://docs.oracle.com/javase/1.5.0/docs/guide/apt/GettingStarted.html),註釋處理工具。對於編譯時檢查。 [Java 7](http://docs.oracle.com/javase/7/docs/technotes/guides/apt/) –

回答

1

雖然這是不太Bean驗證API是什麼,你可以用它執行此驗證。我假設你會使用BV API的參考實現Hibernate Validator

您可以使用簡單的驗證程序獲取否定檢查。修改@Field到

@Constraint(validatedBy = MyFieldValidator.class) 
public @interface Field { 
    String type(); 
    int order(); 
} 

,並創建一個MyFieldValidator類如下

public class MyFieldValidator implements ConstraintValidator<Field, Object> { 

    private int order; 

    @Override 
    public void initialize(Field annotation) { 

     this.order = annotation.order(); 

     if (this.order < 0) { 
      // blow up 
     } 
    } 

    @Override 
    public boolean isValid(Object object, ConstraintValidatorContext constraintContext) { 

     return true; 
    } 
} 

如果再通過驗證,例如把對象使用Validation.buildDefaultValidatorFactory().getValidator().validate(someUser),任何負面訂單註釋屬性都將失敗。

防止重複是棘手的。最激動人心的選擇是在User級別設置驗證註釋,然後使用反射逐個獲取註釋。使用類級別註釋的優點是它爲您提供了一種簡單的方法來告訴Hibernate Validator要檢查哪些類。不太重要的部分是你可能忘記註解課程。

+0

感謝愛默生。正如你所描述的,我已經完成了負面訂單驗證。 –

+0

很高興幫助。你也在這個問題上標記了Spring。如果您不想爲重複檢查執行bean驗證,則另一個選項是創建一個@OrderedFields註釋並將其放在User上,並且在一些PostConstruct中,調用ApplicationContext.getBeansWithAnnotation(OrderedFields.class)來獲取bean,迭代通過類,並用反射檢查字段註釋。 –

0

你可以寫一個驗證器,通過反射檢查值。 你首先在你的應用程序中運行這個驗證器。

+0

爲此,他必須手動驗證每個類的權利?我已經尋找了一種方法來搜索包中的所有類,以獲得沒有成功的類註解。 –

+0

反射api可以幫助你很多 –

+0

是的,但是你不知道一種方法來動態地獲取包中所有類的集合嗎? –

-1

ConstraintValidator應該可以幫到你。

+0

請詳細說明爲什麼這回答了這個問題。考慮添加鏈接到文檔,也許一些代碼示例。 –

0

正如菲利普·桑德斯說,你可以用它運行在上一類使用反射應用程序上下文的啓動方法是獨生子。這是驗證部分。

要獲得給定包中的所有類實現一個接口,有一個註釋或擴展一個類,你可以使用spring的組件掃描器。

退房此鏈接掃描器可能性:

http://javaasylum.blogspot.fr/2011/05/annotation-scanner-with-spring.html?m=1

相關問題