5

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

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

我想 validate order,它不应该是负值,也不应该重复,例如:

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

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

任何人都可以帮我做吗?

4

4 回答 4

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

如果您随后将对象放入验证器,例如 using Validation.buildDefaultValidatorFactory().getValidator().validate(someUser),则任何负序注释属性都将失败。

防止重复更棘手。最明智的选择是在User类级别放置一个验证注释,然后使用反射来一一获取注释。使用类级别注解的优点是它为您提供了一种简单的方法来告诉 Hibernate Validator 要检查哪些类。不太好的部分是您可能会忘记注释类。

于 2013-07-01T20:31:46.850 回答
0

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

要让给定包中的所有类都实现接口、注释或扩展类,您可以使用 spring 的组件扫描器。

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

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

于 2013-07-01T18:11:47.730 回答
-1

ConstraintValidator应该可以帮助你。

于 2013-07-01T15:51:12.700 回答
-1

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

于 2013-07-01T15:43:54.930 回答