在两个不同的上下文中重用自定义的 Hibernate 验证器。

huangapple 未分类评论44阅读模式
英文:

Reuse custom hibernate validator in 2 different contexts

问题

我在一个使用Spring Boot 2.1.5构建的应用程序中拥有以下自定义Hibernate验证器。

public class MyValidator implements ConstraintValidator<MyValidAnnotation, DTO> {
    @Autowired
    private MyBean myBean;

    @Override
    public boolean isValid(DTO dto, ConstraintValidatorContext constraintValidatorContext) {
        // 逻辑
    }
}

我需要在两种情况下使用这个验证器,在isValid方法中我需要跳过一些检查。我找到了一个解决方案,可以使用以下代码在ConstraintValidatorContext上设置参数:

HibernateValidatorFactory hibernateValidatorFactory = Validation.buildDefaultValidatorFactory()
                .unwrap(HibernateValidatorFactory.class);

Validator validator = hibernateValidatorFactory.usingContext()
                .constraintValidatorPayload(RepairEstimateDTO.class.getSimpleName())
                .getValidator();

validator.validate(dto);

问题是MyBean没有被注入,在isValid方法中,myBean为空。

如何在两个上下文中重用这个验证器,而不会出现代码重复?

谢谢

英文:

I have the following custom hibernate validator in a application build with spring boot 2.1.5.

public class MyValidator implements ConstraintValidator&lt;MyValidAnnotation, DTO&gt; {
    @Autowired
    private MyBean myBean;

     @Override
    public boolean isValid(DTO dto, ConstraintValidatorContext constraintValidatorContext) {
        // logic
    }
}

I need to use this validator in 2 cases, in isValid method I need to skip some checkings. I found a solution to set a parameter on ConstraintValidatorContext with the following code:

HibernateValidatorFactory hibernateValidatorFactory = Validation.buildDefaultValidatorFactory()
                .unwrap( HibernateValidatorFactory.class );

Validator validator = hibernateValidatorFactory.usingContext()
                .constraintValidatorPayload(RepairEstimateDTO.class.getSimpleName())
                .getValidator();

validator.validate(dto);

The problem is that MyBean isn't injected, in isValid method myBean is null.

How can I reuse this validator in 2 contexts without code duplication?

Thanks

答案1

得分: 0

我认为这段代码将解决你的问题:

@Bean
public Validator validator(AutowireCapableBeanFactory autowireCapableBeanFactory) {

    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
        .configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
        .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    return validator;
}

来自:https://stackoverflow.com/questions/37958145/autowired-gives-null-value-in-custom-constraint-validator

英文:

I think this piece of code will solve your problem:

@Bean
public Validator validator ( AutowireCapableBeanFactory autowireCapableBeanFactory) {

    ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
        .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    return validator;
}

Copied from: https://stackoverflow.com/questions/37958145/autowired-gives-null-value-in-custom-constraint-validator

huangapple
  • 本文由 发表于 2020年4月3日 22:31:44
  • 转载请务必保留本文链接:https://java.coder-hub.com/61014189.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定