java - JacksonPropertyNodeNameProvider 在自定义创建的约束中添加属性时未获取正确的值
问题描述
我正在使用实际的 json 字段名称而不是JacksonPropertyNodeNameProvider
java 类字段名称来呈现错误,即。我添加了一个自定义约束,因为我想在多个字段上进行验证。当我添加自定义错误时account_id
accountId
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();
}
解决方案
我找到了这种自定义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
不会丢失所做的自动配置。你认为值得为此创建一个问题吗?
推荐阅读
- php - 上传到数据库时检查重复
- javascript - 当值由javascript设置时,隐藏小数位最多2位,如excel不会在php中删除
- javascript - 在 react-native 中,电子邮件深度链接(如共享)不适用于 android
- android - ApiException 检查 FusedLocationApi 中的位置设置
- mongodb - 这个 Mongoose CursorNotFound 错误是什么?
- node.js - 在 Docker 中使用 pm2 start 实现 Nodejs
- javascript - Excel 数据未出现在数组中
- javascript - 谷歌自定义搜索限制没有结果
- reactjs - 反应,Firebase 身份验证错误
- c++ - 在 Visual C++ 中显示日文字符