2012-05-31 29 views
0

使用版本Hibernate验证4.3.0.Final。Hibernate验证 - 调用validateProperty(对象, “列表[0] .field1” 基团)上的嵌套列表项抛出:IllegalArgumentException -

当我做以下电话:

Set<ConstraintViolation<T>> violations = validator.validateProperty(objectForValidation, "list[0].field1", groups); 

上填写了与字段1 ChildClassForValidation的一个实例ClassForValidation的实例= “”

public class ClassForValidation { 

     @NotEmpty 
     private String fielda; 

     @Valid 
     private List<ChildClassForValidation> list = new ArrayList<ChildClassForValidation>(); 

     public ClassForValidation(List<> list, String fielda) { 
       this.list = list; 
       this.fielda = fielda; 
     } 
    } 

    public class ChildClassForValidation { 
     @NotEmpty 
     private String field1; 

     public ChildClassForValidation(String field1) { 
       this.field1 = field1; 
     } 
    } 

我得到follwing例外:

java.lang.IllegalArgumentException: HV000039: Invalid property path. There is no property field1 in entity java.util.ArrayList. 
at org.hibernate.validator.internal.engine.ValidatorImpl.collectMetaConstraintsForPath(ValidatorImpl.java:1141) 
at org.hibernate.validator.internal.engine.ValidatorImpl.collectMetaConstraintsForPath(ValidatorImpl.java:1179) 
at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyInContext(ValidatorImpl.java:616) 
at org.hibernate.validator.internal.engine.ValidatorImpl.validateProperty(ValidatorImpl.java:151) 
... 

寻找到Hibernate验证源我来之后这是一个错误的结论。因为在源代码中似乎有代码尝试处理列表和地图。我相信,错误出在下面这段代码中org.hibernate.validator.internal.engine.ValidatorImpl

private <T, U, V> ValueContext<U, V> collectMetaConstraintsForPath(Class<T> clazz, Object value, Iterator<Path.Node> propertyIter, PathImpl propertyPath, List<MetaConstraint<?>> metaConstraintsList) { 
      Path.Node elem = propertyIter.next(); 
      Object newValue = value; 

      BeanMetaData<?> metaData = beanMetaDataManager.getBeanMetaData(clazz); 
      //use precomputed method list as ReflectionHelper#containsMember is slow 
      if (!metaData.isPropertyPresent(elem.getName())) { 
       throw log.getInvalidPropertyPathException(elem.getName(), metaData.getBeanClass().getName()); 
      } 
      ... 
    } 

在这段代码是验证clazz所具有的属性被验证,问题是当处理field1时,clazz是ArrayList而不是项目(0)的类(即ChildClassForValidation)。

我想提交错误的Hibernate验证项目之前,确认我的发现。谁知道我的属性路径可能只有错误的语法。

回答

0

作为Bean验证1.0,Validator#validateProperty()只支持单属性的验证,但不是完整的属性的路径。作为BV邮件列表上的discussed,此规范的将来修订版可能支持此功能。

+0

嗨贡纳尔。使用hibernate验证器,我可以验证嵌套的属性路径,例如foo.bar.email。这只是一个列表,我已经脱光了。 – Gary

+0

对不起...过早的评论...按错误输入(错过了5分钟的编辑窗口)。以下是其余部分:通过完整的属性路径,您的意思不仅仅是单个属性路径(foo)。使用hibernate验证器,我可以验证嵌套属性路径(例如foo.bar)。这只是一个列表,我已经将foos [0] .bar解开了。而且有很多代码试图在Hibernate验证器中处理列表。 – Gary

+0

是的,我为此创建了[HV-596](https://hibernate.onjira.com/browse/HV-596)。正如在票上讨论的那样,这实际上应该在HV中工作,但似乎存在某些路径的错误。我们需要仔细看看这个。 – Gunnar