在其余的 ubdate 请求中,首先我从数据库读取相关对象,第二次使用 dozer 框架标准映射器 DozerBeanMapper 将 dto 映射到刚刚读取的 dbObject 。接下来,我尝试验证新的映射对象,但验证失败,因为一个字段注释为
@NotEmpty(message = "Name不能为空")
似乎为空,我知道发生这种情况是因为 dbObject 是一个动态代理对象,引用我的由 hibernate 处理的实体,是否存在使用 hibernate validator 验证使用 hibernate.validator.constaints 注释的托管 bean 的任何方式。
@PUT
public Response update(QueryDTO dto) throws ServiceException {
log.info("Request for upadating query");
Query dbObject= this.persistenceService.find( Query.class,dto.getSystemId());
if(dbObject.getVersion()!=dto.getVersion()){
throw new InvalidVersionException("Db version is" + dbObject.getVersion());
}
this.mapper.map(dto,dbObject);
Set<ConstraintViolation<Query>> validationResult= this.validator.validate(dbObject);
if(!validationResult.isEmpty()){
throw new ValidationException(StringifyUtil.buildExceptionMessage(validationResult));
}
Query updatedObject= this.persistenceService.update(dbObject);
return ok(updatedObject);
}
最佳答案
在 BeanValidation API 中,TraversableResolver 用于检查 validator 是否可以访问某个属性。根据您使用的 hibernate validator 版本,有解决此问题的 Hibernate/JPA 实现。
参见http://docs.oracle.com/javaee/7/api/javax/validation/TraversableResolver.html https://docs.jboss.org/hibernate/validator/5.0/api/org/hibernate/validator/internal/engine/resolver/package-summary.html
您可以通过这种方式配置 TraversableResolver
final Configuration<?> conf = Validation.byDefaultProvider().configure();
conf.traversableResolver(new MyTraversableResolver());
ValidatorFactory validatorFactory = conf.buildValidatorFactory();
参见https://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-bootstrapping.html#d0e4238用于引导 validator
关于java - 托管实体上的 Bean 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26648936/