如何验证自定义注释属性?

时间:2013-07-01 15:37:21

标签: java spring

我有一个自定义字段注释类,有两个属性,如下所示:

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;
}

任何人都可以帮助我吗?

4 个答案:

答案 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可以帮到你。