我使用 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/