Hibernate验证 - 仅验证对象是否为空

jax*_*jax 5 java hibernate jpa

我想验证myClass变量.问题是myClass可以是null或对myClass对象的引用.如果它是一个引用,我希望它验证对象,如果它是null,显然不应该进行验证.

以下工作但myClass 不能为null.

public class ParentClass {
    @Valid
    @NotNull
    private MyClass myClass;
}


public MyClass {

    @Pattern(regexp="\\d.{10}")
    private String myField;

}
Run Code Online (Sandbox Code Playgroud)

如果我@NotNull从中删除注释,ParentClass即使我保留注释,也不再执行验证@Valid.

public class ParentClass {
    @Valid
    private MyClass myClass;
}


public MyClass {

    @Pattern(regexp="\\d.{10}") //this validation never takes place
    private String myField;

}
Run Code Online (Sandbox Code Playgroud)

是否可以使用jpa/hibernate注释验证可选的空字段?

Bri*_*ice 5

当你说this validation never takes place你指的是myField为null或填充(或者是)的情况?

由于我在我的一个项目中也使用了Validator,我运行了一些测试,当myField为null时,它没有经过验证.当它不为null时,它就是.我使用以下版本:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.0.1.Final</version>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这是测试代码:

public class MyClass {

    public MyClass() {
    }

    public MyClass(String myField) {
        this.myField = myField;
    }

    @Pattern(regexp="\\d+\\D+")
    private String myField; 
}

public class ParentClass {

    @Valid
    private MyClass myClass;

    public ParentClass() {
    }

    public ParentClass(MyClass myClass) {
        this.myClass = myClass;
    }
}

public class ValidatorTest {

    javax.validation.Validator v;

    @Before
    public void setup() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        v = factory.getValidator();     
    }

    @Test
    public void testValidations() {
        Assert.assertEquals(0, v.validate(new ParentClass()).size()); // Null reference
        Assert.assertEquals(0, v.validate(new ParentClass(new MyClass())).size()); // Valid reference, null field
        Assert.assertEquals(1, v.validate(new ParentClass(new MyClass("I fail"))).size());
        Assert.assertEquals(0, v.validate(new ParentClass(new MyClass("1 pass"))).size());
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.似乎(对我而言)证明的行为是正确的.