JSR-303 не поддерживает такой сценарий? - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь проверить бины с помощью Hibernate Validator. Он должен быть программируемым и основан на файле конфигурации JSON. модели данных:

class A {
    field,
    other fields
}
class B {
    class A a,
    other fields
}
class C {
    class A a,
    other fields
}
class D {
    class B b,
    class C c,
    other fields
}

Проверка D на основе файла конфигурации JSON. Файл конфигурации хочет проверить следующее: Поле D.b.a. не должно быть нулевым. D.c.a.field обнуляется.

Используя программный способ, я установил проверку следующим образом:

constraintMapping
    .type( D.class )
        .property( "b", FIELD )
            .constraint( new NotNullDef() )
            .valid()
.type( B.class )
    .property( "a", FIELD )
        .constraint( new NotNullDef() )
        .valid()
.type ( A.class )
    .property( "field", FIELD )
        .constraint( new NotNullDef() );

Теперь для поля A. установлено не валидатор, но проблема в том, что теперь файл D.c.a.filed также не может быть пустым.

Это всего лишь пример, я абсолютно не хочу менять модели данных.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

@ mark-o, я протестировал следующее решение, но потерпел неудачу.Он проверяет field1 и field2 как для GroupB, так и для GroupC, но я рассчитываю проверить field1 только для GroupB, но не для GroupC, и проверить field2 только для GroupC, но не для GroupB.

Небольшое изменение для класса A (имеетfield1 и field2) и добавьте оболочку для класса A, которая используется как классом B, так и классом C. constraintMapping .type( D.class ) .property( "b", FIELD ) .constraint( new NotNullDef().groups(GroupB.class) ) .valid() .property( "c", FIELD ) .constraint( new NotNullDef().groups(GroupC.class) ) .valid() .type( B.class ) .property( "aWrapper", FIELD ) .constraint( new NotNullDef().groups(GroupB.class) ) .valid() .type( C.class ) .property( "aWrapper", FIELD ) .constraint( new NotNullDef().groups(GroupC.class) ) .valid() .type ( AWrapper.class ) .property( "a", FIELD ) .constraint( new NotNullDef().groups(GroupB.class, GroupC.class) ) .valid() .type ( A.class ) .property( "field1", FIELD ) .constraint( new NotNullDef().groups(GroupB.class) ) .property( "field2", FIELD ) .constraint( new NotNullDef().groups(GroupC.class) );

0 голосов
/ 15 марта 2019

Использование групп на уровне ограничений может помочь вам решить вашу проблему. Чтобы добавить группу в ограничение, вам просто нужно вызвать метод group и передать список групп, в которые должно быть включено ограничение:

constraintMapping
    .type( D.class )
        .property( "b", FIELD )
            .constraint( new NotNullDef().groups( SomeGroup.class )
            .valid()

И тогда вы можете создавать разные группы для разных «путей проверки» и использовать их при проверке объекта. Хотя Thant может работать не очень хорошо, если ваши конфиги проверки полностью динамичны. Также см. doc для получения дополнительной информации о группах.

...