Аннотация @NotEmpty не проверяет, является ли строка нулевой

Я пытаюсь проверить некоторые DTO с помощью javax.validation, но кажется, что аннотация @NotEmpty не проверяет, является ли параметр нулевым.

Вот мои занятия:

Person.class

public class Person {

    @NotEmpty(message = "mandatoryParametersMissing")
    private String name;

    @NotNull(message = "mandatoryParametersMissing")
    @Valid
    private Job job;

    public String getName() {
        return name;
    }

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

    public Job getJob() {
        return job;
    }

    public void setJob(Job job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", job=" + job + "]";
    }

}

Работа.класс

public class Job {

    @NotEmpty(message = "mandatoryParametersMissing")
    private String name;

    @NotNull(message = "mandatoryParametersMissing")
    private Integer salary;

    public String getName() {
        return name;
    }

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

    public Integer getSalary() {
        return salary;
    }

    public void setSalary(Integer salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Job [name=" + name + ", salary=" + salary + "]";
    }

}

Когда я пытаюсь пройти следующие тесты JUnit, я получаю сбои:

@Test(expected = BusinessServiceException.class)
    public void testJobNameNull() {
        Person samuel = new Person();
        samuel.setName("Samuel Antequera");
        Job programmer = new Job();

        programmer.setSalary(18000);
        samuel.setJob(programmer);

        validatePerson(samuel);
    }

А вот метод, который проверяет DTO:

public void validatePerson(Person in) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<Person>> violations = validator.validate(in);
    for (ConstraintViolation<Person> violation : violations) {
        throw new BusinessServiceException(violation.getMessage(), violation.getPropertyPath().toString());
    }
}

У меня сложилось впечатление, что @NotEmpty сначала проверил, был ли параметр нулевым, я ошибаюсь?

PD: Вот зависимости, которые я использую:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.1.0.Alpha5</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>6.1.0.Alpha5</version>
    </dependency>

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.1-b06</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.el</artifactId>
        <version>2.2.6</version>
    </dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

Кажется, проблема была с зависимостями, по какой-то причине в пути к классу версия jar для validation-api была неправильной. Я просто удалил все банки в пути к классу и добавил их снова, и ошибка исчезла.


person Community    schedule 17.07.2019    source источник
comment
Установка для полей пустого значения, а не нулевого значения, вызывает ошибку проверки?   -  person Giacomo Alzetta    schedule 17.07.2019
comment
Нет, это все еще не вызывает ошибку проверки. Я начинаю думать, что проблема в версии моих зависимостей, я их добавил в пост.   -  person    schedule 17.07.2019
comment
Эм. Похоже, что валидатор не распознает аннотации. Это может быть проблема с зависимостями. Вы должны поставить точку останова перед вызовом validate и попытаться отладить шаг за шагом... надеюсь, в какой-то момент вы обнаружите, откуда валидатор получает поля и соответствующие аннотации, и вы сможете проверить, почему валидатор игнорирует их. В любом случае: я бы начал с использования стабильной версии вместо альфа-версии...   -  person Giacomo Alzetta    schedule 17.07.2019
comment
Спасибо за помощь, похоже проблема была с зависимостями, почему-то в class path неправильная jar версия validation-api.   -  person    schedule 22.07.2019
comment
Я рад, что вы решили свою проблему. Вы можете ответить на свой вопрос, пояснив, как вы его решили, и принять свой собственный ответ.   -  person Giacomo Alzetta    schedule 22.07.2019


Ответы (4)


@NotEmpty внутренне проверяет минимальный размер 1 и null. В документации @NotEmpty четко указано, что:
"Asserts that the annotated string, collection, map or array is not {@code null} or empty."

person Community    schedule 17.07.2019
comment
Ну, когда я запускаю тест, он этого не делает. - person ; 17.07.2019
comment
Да, и он все еще не проходит тест - person ; 17.07.2019

Я создал демо-проект с вашими фрагментами кода, и он работает, не могли бы вы проверить, нет ли различий? Вы действительно импортировали javax.validation.constraints.NotEmpty.

Не могли бы вы также поделиться демонстрационным проектом, который показывает реальную проблему? Не могли бы вы распечатать toString объекта person в своем тесте и поделиться выводом вашего

Посмотреть демо-проект

------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running nl.martinvw.test.PersonTest
jul 17, 2019 2:38:01 PM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 6.1.0.Alpha5
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.353 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
person Martin van Wingerden    schedule 17.07.2019
comment
Спасибо за помощь, похоже проблема была с зависимостями, почему-то в class path неправильная jar версия validation-api. - person ; 22.07.2019

@NotEmpty также проверяет @NotNull и дополнительно проверяет размер/длину предоставленного объекта. Для вашего приведенного выше тестового примера вы получите 1 нарушение, потому что вы не установили имя задания (его значение равно null), и в вашей конфигурации указано @NotEmpty(message = "mandatoryParametersMissing") private String name;

Таким образом, @NotEmpty покрывает ваш случай @NotNull.

Я запустил ваш приведенный выше код, и он работал нормально. Я использовал приведенную ниже зависимость

Я запустил ваш код, и он отлично работает для меня. Проверьте импорт на @NotEmpty

org.hibernate.validator.constraints.NotEmpty

Я использовал приведенную ниже зависимость

   <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.13.Final</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
person ashit07    schedule 17.07.2019

Кажется, проблема была с зависимостями, по какой-то причине в пути к классу версия jar для validation-api была неправильной. Я просто удалил все банки в пути к классу и добавил их снова, и ошибка исчезла.

person Community    schedule 22.07.2019