0

バージョンHibernateValidator4.3.0.Finalを使用します。

次の電話をかけると:

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

field1=""のChildClassForValidationの1つのインスタンスが設定された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;
        }
    }

次の例外が発生します:

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のソースを調べた後、これはバグであるという結論に達しました。ソースには、リストとマップの両方を処理しようとするコードがあるようです。エラーは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がitem(0)のクラス(つまり、ChildClassForValidation)ではなくArrayListであるということです。

Hibernate Validatorプロジェクトにバグを送信する前に、調査結果を確認したいと思います。プロパティパスの構文が間違っている可能性があることを誰が知っていますか。

4

1 に答える 1

0

Bean Validation 1.0以降、Validator#validateProperty()単一のプロパティの検証のみをサポートし、完全なプロパティパスはサポートしていません。BVメーリングリストで説明されているように、このような機能は、仕様の将来のリビジョンでサポートされる可能性があります。

于 2012-06-01T16:56:45.500 に答える