首页 > 解决方案 > JacksonPropertyNodeNameProvider 在自定义创建的约束中添加属性时未获取正确的值

问题描述

我正在使用实际的 json 字段名称而不是JacksonPropertyNodeNameProviderjava 类字段名称来呈现错误,即。我添加了一个自定义约束,因为我想在多个字段上进行验证。当我添加自定义错误时account_idaccountId

context.buildConstraintViolationWithTemplate("customField is a mandatory unique attribute")
            .addPropertyNode("customField").addBeanNode().addConstraintViolation();

它只是返回customField错误而不是 custom_field。如果我尝试将 PropertNode 设置为custom_field它,则 ISE 会出错。是否有一些我需要设置的配置或我需要做的其他事情才能使其正常工作?这就是我初始化验证器的方式。

@Bean
public Validator validator(@Autowired ObjectMapper objectMapper) {
    JacksonPropertyNodeNameProvider propertyNodeNameProvider = new JacksonPropertyNodeNameProvider(objectMapper);
    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
            .configure()
            .propertyNodeNameProvider(propertyNodeNameProvider)
            .buildValidatorFactory();
    return validatorFactory.getValidator();
}

标签: javaspringspring-boothibernate-validator

解决方案


我找到了这种定义PropertyNodeNameProvider. 我使用的是 Spring Boot 2.5.2,我对org.springframework.validation.beanvalidation.SpringValidatorAdapter#getRejectedValue. 但是,PropertyNodeNameProvider自定义的方式可以改进,因为当您生成 的自定义 bean 时org.springframework.validation.beanvalidation.LocalValidatorFactoryBean,您会丢失org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration. 您可以通过创建 的代理类来解决此问题org.springframework.validation.beanvalidation.LocalValidatorFactoryBean,但您需要覆盖所有方法并将所有调用委托给原始实例,这将产生一个冗长的解决方案。我认为最好的方法是通过接口而不是内部的受保护方法org.springframework.validation.beanvalidation.LocalValidatorFactoryBean,这样定制会很简单,并且org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration不会丢失所做的自动配置。你认为值得为此创建一个问题吗?


推荐阅读