如何从构造函数中使用Java验证器注释?

时间:2016-08-08 17:04:42

标签: java spring validation bean-validation

我拥有持有String的价值对象。该字符串受到一些限制(长度,允许的字符等)。

我想使用Java或Spring验证API来验证我的对象。 我想在创建时验证我的域对象(在构造函数中)。

实现该示例代码(使用验证API验证this):

void validate() {
        LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
        Set<ConstraintViolation<Msisdn>> violations = localValidatorFactoryBean.getValidator().validate(this);
        if (!violations.isEmpty()) {
            throw new ConstraintViolationException(violations);
        }
    }

我不知道如何从构造函数中获取javax.validation.Validator的实例。

在Spring托管代码(服务)中,我只能@Autowire javax.validation.Validator的实例  或org.springframework.validation.Validator并且它有效。

但是如何使它在Spring管理的代码之外工作(在值对象的构造函数中,它独立存在)?

我知道我可以使用ifs编写验证规则,但验证注释使代码更简单。

1 个答案:

答案 0 :(得分:0)

Hibernate Validator documentation describes how to get instance of javax.validation.Validator

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

但它不适合在构造函数中构建ValidatorFactory。这是一项耗时的操作。也许在thrad-local中使用缓存引用会有所帮助,但我不喜欢那种增加的复杂性。

最后,我决定使用我的值对象编写验证规则 Guava Preconditions

 Preconditions.checkNotNull(value, "value cannot be null");