java - 在自定义创建的约束中添加属性时,JacksonPropertyNodeNameProvider 未选取正确的值

标签 java spring spring-boot hibernate-validator

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

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

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

@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();
}

最佳答案

我找到了这个way定制PropertyNodeNameProvider 。我正在使用 Spring Boot 2.5.2,并且 org.springframework.validation.beanvalidation.SpringValidatorAdapter#getRejectedValue 没有任何问题。然而,方式PropertyNodeNameProvider定制可以改进,因为当你生成org.springframework.validation.beanvalidation.LocalValidatorFactoryBean的定制bean时,您将丢失 org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration 所做的配置。您可以通过创建代理类 org.springframework.validation.beanvalidation.LocalValidatorFactoryBean 来解决此问题,但是您需要重写所有方法并将所有调用委托(delegate)给原始实例,这将是一个冗长的解决方案。我认为最好的方法是通过接口(interface)而不是 org.springframework.validation.beanvalidation.LocalValidatorFactoryBean 内的 protected 方法,这样定制就会很简单,自动配置由 org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration 进行。不会丢失。您认为值得为此创建一个问题吗?

关于java - 在自定义创建的约束中添加属性时,JacksonPropertyNodeNameProvider 未选取正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60809437/

相关文章:

java - spring jdbctemplate为last_insert_id()返回0

java - 为什么会引发 'deleted entity passed to persist' -异常?

JavaFX FXML 访问通过 Lookup() 方法成功,但通过 @FXML 注释失败

java - Spring-amqp - 消息处理延迟

hibernate - SpringBoot Hibernate 现有数据库表的实体映射

java - 调用init方法失败;嵌套异常是 org.hibernate.AnnotationException : mappedBy reference an unknown target entity property:

spring - 允许在 Rest 端点 Spring Boot 上发布

java - 使用 JSch 使用 SFTP 或 SCP 更改文件权限

java - Android:随机播放变量和多个 setText

java - 在此平台上 eclipse 无效名称