我有一个自定义字段注释类,有两个属性,如下所示:
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 :(得分:4)
虽然这不是Bean Validation API的用途,但您可以使用它执行此验证。我假设您使用了Hibernate Validator,这是BV API的参考实现。
您可以使用简单的验证器进行否定检查。将@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)
,任何负序注释属性都将失败。
防止重复比较棘手。 sanest选项是在User
类级别放置验证注释,然后使用反射逐个获取注释。使用类级别注释的优点是它为您提供了一种简单的方法来告诉Hibernate Validator要检查哪些类。不太重要的是你可能忘记给课堂注释。
答案 1 :(得分:0)
正如Philipp Sanders所说,你可以使用在启动应用程序上下文时运行方法的单例,该方法在类上使用反射。这是验证部分。
要获取给定包中实现接口的所有类,使用注释或扩展类,可以使用spring的组件扫描程序。
查看此链接以了解扫描仪的可能性:
http://javaasylum.blogspot.fr/2011/05/annotation-scanner-with-spring.html?m=1
答案 2 :(得分:-1)
您可以编写一个通过反射检查值的验证器。 您首先在应用程序中运行此验证程序。
答案 3 :(得分:-1)
ConstraintValidator
可以帮到你。