繁体   English   中英

受管实体上的Bean验证

[英]Bean validation on managed entity

在一个剩余的ubdate请求上,首先我正在从数据库中读取相关对象,第二次使用dozer框架标准映射器DozerBeanMapper将dto映射到刚刚读取的dbObject。 接下来,我尝试验证新的映射对象,但是验证失败,因为一个用@NotEmpty(message = "Name cannot be empty ")注释的字段似乎为null,我知道这是因为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用于检查验证程序是否可以访问属性。 根据您使用的hibernate验证程序版本,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引导验证程序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM