버전 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 프로젝트에 버그를 보내기 전에 나의 발견을 확인하고 싶다. 내 재산 경로에 대한 구문이 틀릴 수도 있습니다.
안녕하세요. Gunnar. 최대 절전 유효성 검사기를 사용하여 중첩 된 속성 경로를 확인할 수있었습니다. foo.bar.email. 내가 떼어 놓은 목록 일뿐입니다. – Gary
죄송합니다 ...시기 상조 발언 ... 실수로 입력했습니다 (5 분 편집 창을 놓치 셨습니다). 나머지는 여기 있습니다 : 완전한 속성 경로는 단순히 단일 속성 경로 (foo) 이상의 것을 의미합니다. hibernate validator를 사용하여 중첩 된 속성 경로 (예 : foo.bar)의 유효성을 검사 할 수있었습니다. 그것은 단지 내가 foos [0] .bar를 떼어 놓았던 목록이다. 그리고 hibernate validator에서리스트를 처리하려고하는 코드가 꽤있다. – Gary
예, 저는 이것을 위해 [HV-596] (https://hibernate.onjira.com/browse/HV-596)을 만들었습니다. 티켓에서 논의했듯이, 이것은 실제로 HV에서 작동해야하며, 특정 경로의 버그가있는 것으로 보입니다. 우리는 이것을 좀 더 자세히 살펴볼 필요가 있습니다. – Gunnar