注解 @NotEmpty 不检查 String 是否为 null
Annotation @NotEmpty doesn't check if String is null
我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 没有检查参数是否为 null。
这是我的课程:
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 + "]";
}
}
Job.class
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 首先检查参数是否为 null,我错了吗?
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>
似乎问题出在依赖关系上,由于某种原因在 class 路径中验证的 jar 版本-api 是错误的我只是删除了 [=37= 中的所有 jar ] 路径并再次添加它们,错误消失。
@NotEmpty 内部检查最小大小为 1 和 null.On @NotEmpty 的文档,明确提到:
"Asserts that the annotated string, collection, map or array is not {@code null} or empty."
我用你的代码片段创建了一个 demo-project 并且它可以工作,你能检查一下有什么不同吗?你真的导入了吗javax.validation.constraints.NotEmpty
.
您能否也分享一个显示实际问题的 demo-project?您能否在测试中打印 person
对象的 toString
并共享
的输出
------------------------------------------------------
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
@NotEmpty 还会检查 @NotNull 并另外检查所提供对象的 size/length。
对于上面的测试用例,你将得到 1 次违规,因为你没有设置作业名称(它的空值)并且你的配置说
@NotEmpty(消息="mandatoryParametersMissing")
私有字符串名称;
所以@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>
似乎问题出在依赖关系上,由于某种原因在 class 路径中 validation-api 的 jar 版本是错误的我只是删除了 class 路径中的所有 jar并再次添加它们,错误消失了。
检查@NotEmpty 的导入:
org.hibernate.validator.constraints.NotEmpty
对我有用!
我使用 Spring Boot 2.5.5
和 Hibernate 验证器 6.2.0.final
。
请注意 javax.validation.constraints.NotBlank
无效!
我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 没有检查参数是否为 null。
这是我的课程:
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 + "]";
}
}
Job.class
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 首先检查参数是否为 null,我错了吗?
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>
似乎问题出在依赖关系上,由于某种原因在 class 路径中验证的 jar 版本-api 是错误的我只是删除了 [=37= 中的所有 jar ] 路径并再次添加它们,错误消失。
@NotEmpty 内部检查最小大小为 1 和 null.On @NotEmpty 的文档,明确提到:
"Asserts that the annotated string, collection, map or array is not {@code null} or empty."
我用你的代码片段创建了一个 demo-project 并且它可以工作,你能检查一下有什么不同吗?你真的导入了吗javax.validation.constraints.NotEmpty
.
您能否也分享一个显示实际问题的 demo-project?您能否在测试中打印 person
对象的 toString
并共享
------------------------------------------------------
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
@NotEmpty 还会检查 @NotNull 并另外检查所提供对象的 size/length。 对于上面的测试用例,你将得到 1 次违规,因为你没有设置作业名称(它的空值)并且你的配置说 @NotEmpty(消息="mandatoryParametersMissing") 私有字符串名称;
所以@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>
似乎问题出在依赖关系上,由于某种原因在 class 路径中 validation-api 的 jar 版本是错误的我只是删除了 class 路径中的所有 jar并再次添加它们,错误消失了。
检查@NotEmpty 的导入:
org.hibernate.validator.constraints.NotEmpty
对我有用!
我使用 Spring Boot 2.5.5
和 Hibernate 验证器 6.2.0.final
。
请注意 javax.validation.constraints.NotBlank
无效!