根据自定义验证规则验证JavaBean的最佳方法是什么?

根据自定义验证规则验证JavaBean的最佳方法是什么?,java,validation,Java,Validation,在这里,我想使用数据库中为每个字段定义的自定义规则集来验证这些字段 e、 g.验证name字段的长度-不同公司的验证长度可能不同 情景: 对于公司x,名称字段的最大长度可以是20。 对于公司y,名称字段的最大长度可以是30。 如何在运行时应用此验证标准?我看到至少两种方法 Bean验证 使用javax.validation.constraints包中的注释注释域对象的字段(您需要验证的字段,在您的案例中是用户) 要执行验证,您需要获取javax.validation.Validator的实例 并

在这里,我想使用数据库中为每个字段定义的自定义规则集来验证这些字段

e、 g.验证
name
字段的长度-不同公司的验证长度可能不同

情景: 对于公司x,名称字段的最大长度可以是20。 对于公司y,名称字段的最大长度可以是30。
如何在运行时应用此验证标准?

我看到至少两种方法

Bean验证 使用
javax.validation.constraints包中的注释注释域对象的字段(您需要验证的字段,在您的案例中是用户)

要执行验证,您需要获取javax.validation.Validator的实例 并使用它

示例代码

public class User {
    private String name;
    private Integer age;
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return this.age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}
您可以在构建器中验证setters、constructor和build()方法中的参数—每次对象构建完成并且需要检查不变量时

在这个场景中,只需要Guava库。它与Java验证API或实现无关

条件验证 如果希望验证依赖于上下文(而不仅仅是要验证的类),那么验证规则不应该放在要验证的类上

在Spring中,您可以将验证器作为外部类编写

 Preconditions.checkNotNull(value, "value cannot be null");
 Preconditions.checkArgument(..)
公共类PersonValidator实现验证器{
公共布尔支持(类clazz){
返回人.class.equals(clazz);
}
公共无效验证(对象obj,错误e){
ValidationUtils.rejectIfEmpty(e,“name”,“name.empty”);
人员p=(人员)obj;
if(p.getAge()<0){
e、 拒绝价值(“年龄”、“负面价值”);
}else if(p.getAge()>110){
e、 拒绝价值(“年龄”、“太老了”);
}
}
}
有关更多详细信息,请参阅

同样的原则(带有验证逻辑的外部类)也可以应用于番石榴


然后,在您的业务逻辑中,您将能够选择并使用正确的验证器。

使用JavaBean验证库既不需要Spring也不需要Guava,尽管两者都可以使用。true。但我的代码示例使用LocalValidatoryFactoryBean,它是Spring组件。第二个样本(番石榴)与JavaBean验证无关。更新了答案,详细说明了每个场景的依赖关系;Spring不是这样一个框架——它是一个DI框架。它在JSR303上提供了包装器,以便更方便地使用。回答aleady说“在没有Spring的情况下也可以使用java验证”。我的观点是Spring与JSR303的关系和与HTTP的关系一样。我不太清楚为什么会提到它。这就像说“为了在Java中添加两个数字,只需添加Jython库并执行这个简单的脚本”——虽然它可能会达到预期的效果,但这有点像一个场景。
 Preconditions.checkNotNull(value, "value cannot be null");
 Preconditions.checkArgument(..)
public class PersonValidator implements Validator {

    public boolean supports(Class clazz) {
        return Person.class.equals(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
        Person p = (Person) obj;
        if (p.getAge() < 0) {
            e.rejectValue("age", "negativevalue");
        } else if (p.getAge() > 110) {
            e.rejectValue("age", "too.darn.old");
        }
    }
}