Я пытаюсь проверить некоторые 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 была неправильной. Я просто удалил все банки в пути к классу и добавил их снова, и ошибка исчезла.
validate
и попытаться отладить шаг за шагом... надеюсь, в какой-то момент вы обнаружите, откуда валидатор получает поля и соответствующие аннотации, и вы сможете проверить, почему валидатор игнорирует их. В любом случае: я бы начал с использования стабильной версии вместо альфа-версии... - person Giacomo Alzetta   schedule 17.07.2019