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

Java 如何验证自定义注释属性?,java,spring,Java,Spring,我有一个自定义字段注释类,具有以下两个属性: public @interface Field { String type(); int order(); } 我想验证订单,它不应该是负值,也不应该重复,例如: class User { @Field(uiType = "TEXT", order = 1) private String fName; @Field(uiType = "TEXT", order = 2) private String

我有一个自定义字段注释类,具有以下两个属性:

public @interface Field {
    String type();
    int order();
}
我想验证订单,它不应该是负值,也不应该重复,例如:

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

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

有人能帮我吗?

您可以编写一个验证器,通过反射检查值。
您首先在应用程序中运行此验证器。

ConstraintValidator应该会帮助您


正如Philipp Sanders所说,您可以使用一个singleton,它在应用程序上下文启动时运行一个方法,该方法在类上使用反射。这是验证部分

要获得实现接口的给定包中的所有类,可以使用spring的组件扫描程序进行注释或扩展类

查看此链接以了解扫描仪的可能性:


尽管这不是Bean验证API的真正用途,但您可以使用它执行此验证。我假设您会使用BVAPI的参考实现

您可以使用一个简单的验证器来进行否定检查。将@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;
    }
}
公共类MyFieldValidator实现ConstraintValidator{
私人内部订单;
@凌驾
公共void初始化(字段注释){
this.order=annotation.order();
如果(本订单<0){
//炸毁
}
}
@凌驾
公共布尔值有效(对象对象、ConstraintValidatorContext constraintContext){
返回true;
}
}
如果随后将对象放入验证器,例如使用
Validation.buildDefaultValidatorFactory().getValidator().validate(someUser)
,则任何负序注释属性都将失败


防止重复更为棘手。sanest选项是在
用户
类级别放置验证注释,然后使用反射逐个获取注释。使用类级注释的优点是,它为您提供了一种简单的方法来告诉Hibernate验证器要检查哪些类。不太重要的是,您可能会忘记对类进行注释。

您是否试图确保在反射期间以特定顺序返回变量?请提供有关问题的更多信息。请使用Java的注释处理工具。用于编译时检查。为此,他必须手动验证每个类,对吗?我一直在寻找一种方法来搜索包中的所有类以获取类注释,但没有成功。反射api可以帮助您很多。是的,但您不知道如何动态获取包中所有类的集合,是吗?因此,需要第三方依赖关系。请详细说明为什么这可以回答问题。考虑添加文档链接,也许还有一些代码示例。谢谢Emerson。正如你所描述的,我已经做了负序验证。很高兴它有帮助。在这个问题中,您还标记了Spring。如果您不想对重复检查执行bean验证,另一个选项是创建@OrderedFields注释并将其放在User上,并且在某些后期构造中,调用ApplicationContext.getBeansWithAnnotation(OrderedFields.class)以获取bean,遍历类,并使用反射检查字段注释。