Как сказать hibernate validator проверять только одну аннотацию? - PullRequest
0 голосов
/ 15 октября 2019

Можно ли сказать, что проверка гибернации проверяет только одну конкретную аннотацию? Я создал пользовательскую аннотацию, в которой пока используется javax.validation.ConstraintValidator. Однако, когда я хочу вручную проверить объект с помощью

javax.validation.Validator.validate(myOjbect);

, он проверит все аннотации, включая @NotNull, @Size ... Есть ли элегантный способ переопределить это поведение, чтобы я мог выбрать, какие аннотации проверять?

1 Ответ

1 голос
/ 15 октября 2019

Я не могу найти способ ограничить проверку конкретной аннотацией без изменения проверенного класса. Вы можете ограничить его свойством, вызвав Validator##validateProperty(object, propertyName, ...), но для того, чтобы явно ограничить его набором аннотаций, необходимо назначить группы аннотациям :

.

  1. Создайте интерфейс для каждой группы аннотаций, которые вы хотите проверить.
  2. Укажите этот интерфейс для groups свойства каждой аннотации для проверки с этой группой. Если аннотация также должна проверяться по умолчанию, либо добавьте интерфейс Default.
  3. Добавьте интерфейс к вызовам валидатора.

Пример:

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.groups.Default;

public class SomeTest {

    public static void main(String[] args) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Cat a = new Cat(null);
        // invalid: name is null
        output(validator.validate(a), a);

        Cat b = new Cat("?");
        // invalid: name too short
        output(validator.validate(b), b);

        // valid: only @NotNull is evaluated, @Size does not matter.
        output(validator.validate(b, NotNullName.class), b);

        // invalid: only @NotNull is evaluated, @Size does not matter. Name is null.
        output(validator.validate(a, NotNullName.class), a);
    }

    /**
     * Output validation result.
     *
     * @param validate
     *            the validate
     */
    private static void output(Set<ConstraintViolation<Cat>> validationResult, Cat cat) {
        if (validationResult.isEmpty()) {
            System.out.println(cat + " is valid!");
        } else {
            System.out.println(cat + " is invalid!\n" + validationResult);
        }
    }

    // no need to implement an interface - just name it for annotation groups attribute:
    public static class Cat {
        @NotNull(groups = { NotNullName.class, Default.class })
        @Size(min = 3, max = 45)
        private String name;

        public Cat(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("Cat [");
            if (name != null) {
                builder.append("name=");
                builder.append(name);
            }
            builder.append("]");
            return builder.toString();
        }

    }

    public static interface NotNullName {
        // no members needed here
    }
}

Вывод:

Cat [] is invalid!
[ConstraintViolationImpl{interpolatedMessage='darf nicht null sein', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.NotNull.message}'}, ConstraintViolationImpl{interpolatedMessage='darf nicht null sein', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.NotNull.message}'}]
Cat [name=?] is invalid!
[ConstraintViolationImpl{interpolatedMessage='Länge muss zwischen 3 und 45 liegen', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.Size.message}'}]
Cat [name=?] is valid!
Cat [] is invalid!
[ConstraintViolationImpl{interpolatedMessage='darf nicht null sein', propertyPath=name, rootBeanClass=class SomeTest$Cat, messageTemplate='{javax.validation.constraints.NotNull.message}'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...