2014-10-30 52 views
0

在休息ubdate請求上,首先我從數據庫讀取相關對象,然後使用dozer框架standart mapper,DozerBeanMapper將第二個映射到dbObject。接下來,我試圖驗證新的映射對象,但驗證失敗,因爲一個字段註釋 @NotEmpty(message = "Name cannot be empty ")似乎爲空,我知道這是因爲dbObject是一個動態代理對象引用我的實體處理hibernate,有沒有什麼辦法驗證託管用hibernate.validator.constaints使用hibernate驗證器註釋bean。在託管實體上的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); 
} 

回答

1

在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提供引導驗證