2012-05-31 2 views
0

버전 Hibernate Validator 4.3.0.Final 사용.Hibernate Validator - 중첩 된리스트 항목에 대해 validateProperty (object, "list [0] .field1", groups)를 호출하면 IllegalArgumentException이 발생합니다.

나는 다음 호출 할 때 : 필드 1과 ChildClassForValidation의 인스턴스로 채워 ClassForValidation의 인스턴스에

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

= ""

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 Validator 소스를 살펴본 후 나는 이것이 버그라는 결론. 출처의 경우 목록과지도를 모두 처리하려고하는 코드가있는 것으로 보입니다. 나는 오류가 clazz에이 속성이 검증되지 않았는지 확인이 코드 조각에서 에 다음 코드 조각 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()); 
      } 
      ... 
    } 

거짓말을 믿고, 문제는 field1을 처리 할 때 clazz는 항목 (0)의 클래스 (즉 ChildClassForValidation) 대신 ArrayList입니다.

나는 Hibernate Validator 프로젝트에 버그를 보내기 전에 나의 발견을 확인하고 싶다. 내 재산 경로에 대한 구문이 틀릴 수도 있습니다.

답변

0

Bean 유효성 검사 1.0부터 Validator#validateProperty()은 단일 속성의 유효성 검사 만 지원하지만 완전한 속성 경로는 지원하지 않습니다. BV 메일 링리스트에 discussed이 있으므로 향후에이 사양이 지원 될 수 있습니다.

+0

안녕하세요. Gunnar. 최대 절전 유효성 검사기를 사용하여 중첩 된 속성 경로를 확인할 수있었습니다. foo.bar.email. 내가 떼어 놓은 목록 일뿐입니다. – Gary

+0

죄송합니다 ...시기 상조 발언 ... 실수로 입력했습니다 (5 분 편집 창을 놓치 셨습니다). 나머지는 여기 있습니다 : 완전한 속성 경로는 단순히 단일 속성 경로 (foo) 이상의 것을 의미합니다. hibernate validator를 사용하여 중첩 된 속성 경로 (예 : foo.bar)의 유효성을 검사 할 수있었습니다. 그것은 단지 내가 foos [0] .bar를 떼어 놓았던 목록이다. 그리고 hibernate validator에서리스트를 처리하려고하는 코드가 꽤있다. – Gary

+0

예, 저는 이것을 위해 [HV-596] (https://hibernate.onjira.com/browse/HV-596)을 만들었습니다. 티켓에서 논의했듯이, 이것은 실제로 HV에서 작동해야하며, 특정 경로의 버그가있는 것으로 보입니다. 우리는 이것을 좀 더 자세히 살펴볼 필요가 있습니다. – Gunnar