【问题标题】:Reuse custom hibernate validator in 2 different contexts在 2 个不同的上下文中重用自定义休眠验证器
【发布时间】:2020-04-03 14:31:44
【问题描述】:

我在使用 spring boot 2.1.5 构建的应用程序中有以下自定义休眠验证器。

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

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

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

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

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

validator.validate(dto);

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

如何在不重复代码的情况下在 2 个上下文中重用此验证器?

谢谢

【问题讨论】:

    标签: java hibernate spring-boot hibernate-validator


    【解决方案1】:

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

    @Bean
    public Validator validator ( AutowireCapableBeanFactory autowireCapableBeanFactory) {
    
        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
            .configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
            .buildValidatorFactory();
        Validator validator = validatorFactory.getValidator();
    
        return validator;
    }
    

    复制自:Autowired gives Null value in Custom Constraint validator

    【讨论】:

    • 感谢您的回复,这解决了注入 bean 的问题。使用此解决方案,我如何将相同的验证器用于 2 个不同的上下文? (例如,如果我从 Service1 进行调用,我想跳过 isValid 方法中的一些逻辑,并将逻辑保留为 service2 的逻辑)
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多