Java 注释@NotEmpty不';t检查字符串是否为空

Java 注释@NotEmpty不';t检查字符串是否为空,java,junit,javax.validation,Java,Junit,Javax.validation,我试图用javax.validation验证一些DTO,但似乎注释@NotEmpty没有检查参数是否为null 这是我的课程: 个人类 public class Person { @NotEmpty(message = "mandatoryParametersMissing") private String name; @NotNull(message = "mandatoryParametersMissing") @Valid private Job

我试图用javax.validation验证一些DTO,但似乎注释@NotEmpty没有检查参数是否为null

这是我的课程:

个人类

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());
    }
}
public void validatePerson(中的人){
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
设置冲突=validator.validate(在中);
for(约束冲突:冲突){
抛出新的BusinessServiceException(违例。getMessage(),违例。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>

javax.validation
验证api
2.0.1.最终版本
org.hibernate.validator
休眠验证器
6.1.0.5
org.hibernate.validator
hibernate验证程序注释处理器
6.1.0.5
javax.el
javax.el-api
3.0.1-b06
org.glassfish.web
javax.el
2.2.6
朱尼特
朱尼特
4.12

问题似乎出在依赖项上,由于某些原因,在类路径中,验证api的jar版本是错误的,我只是删除了类路径中的所有jar,然后再次添加它们,错误就消失了

@NotEmpty在内部检查最小大小为1和null。在@NotEmpty的文档中,明确提到:

“声明带注释的字符串、集合、映射或数组不是{@code null}或空的。”

我用您的代码片段创建了一个演示项目,它可以工作,您是否可以检查任何差异?你真的导入了
javax.validation.constraints.NotEmpty

你也可以分享一个演示项目,其中显示了实际的问题?您是否可以打印测试中
person
对象的
toString
,并共享测试结果

------------------------------------------------------
T T S T S
-------------------------------------------------------
运行nl.martinvw.test.PersonTest
2019年7月17日下午2:38:01 org.hibernate.validator.internal.util.Version
信息:HV000001:Hibernate验证程序6.1.0.5
测试运行:2,失败:0,错误:0,跳过:0,所用时间:0.353秒
结果:
测试运行:2,失败:0,错误:0,跳过:0

@NotEmpty还检查@NotNull,并额外检查所提供对象的大小/长度。 对于您上面的测试用例,您将得到1个违规,因为您没有设置作业名称(其为null),并且您配置了 @NotEmpty(message=“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>

org.hibernate
休眠验证器
6.0.13.1最终版本
玻璃鱼
javax.el
3.0.0
朱尼特
朱尼特
4.12
测试

问题似乎出在依赖项上,由于某些原因,在类路径中,jar版本的验证api是错误的,我只是删除了类路径中的所有jar,然后再次添加它们,错误就消失了。

好吧,当我运行测试时,它不会这样做。是的,而且它仍然无法通过测试将字段设置为空值且不为null是否会触发验证错误?不,它仍然不会触发验证错误。我开始认为问题在于我的依赖关系的版本,我将它们添加到post.Uhm。验证程序似乎无法识别注释。这可能是依赖项的问题。您应该在调用
validate
之前放置一个断点,并尝试一步一步地调试。。。希望在某个时候,您会发现验证器从何处获得字段和相应的注释,并且您应该能够检查验证器为什么会忽略它们。无论如何:我会从使用稳定版本开始,而不是使用alpha版本…感谢您的帮助,似乎问题出在依赖项上,由于类路径中的某些原因,验证api的jar版本是错误的。我很高兴您已经解决了您的问题。您可以回答自己的问题,澄清您是如何解决的,并接受自己的答案。感谢您的帮助,问题似乎出在依赖项上,由于类路径中的某些原因,验证api的jar版本是错误的。
   <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>