Hibernate验证 - 只验证对象是否为空 [英] Hibernate validation - only validate if object is not null

查看:155
本文介绍了Hibernate验证 - 只验证对象是否为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想验证 myClass 变量。麻烦的是, myClass 既可以是 null ,也可以是引用到myClass对象。如果它是一个引用,我希望它验证该对象,如果它为空,显然不应该进行验证。



以下工作,但myClass 不能 be null。

  public class ParentClass {
@Valid
@NotNull
private MyClass我的课;
}


public MyClass {

@Pattern(regexp =\\。{10})
private字符串myField;




$ b如果我删除 @NotNull > ParentClass 中的注释不会再执行验证,即使我保留 @Valid 注释。

  public class ParentClass {
@Valid
private MyClass myClass;
}


public MyClass {

@Pattern(regexp =\\。{10})// this validation never发生
private String myField;




$ b $ p
$ b $ p是可以验证一个可选的空字段使用jpa / hibernate注解?

解决方案

当你说这个验证永远不会发生你是指myField为null或填充(或两者)的情况?

因为我也在我的一个项目中使用Validator,所以我运行了一个小测试,当myField为空时,它不被验证。当它不是空的,它是。我使用以下版本:

 <依赖关系> 
< groupId> javax.validation< / groupId>
< artifactId> validation-api< / artifactId>
< version> 1.1.0.Final< / version>
< /依赖关系>
< dependency>
< groupId> org.hibernate< / groupId>
< artifactId> hibernate-validator< / artifactId>
< version> 5.0.1.Final< / version>
< /依赖关系>
< dependency>
< groupId> javax.el< / groupId>
< artifactId> javax.el-api< / artifactId>
< version> 3.0.0< / version>
< /依赖关系>
< dependency>
< groupId> org.glassfish.web< / groupId>
< artifactId> javax.el< / artifactId>
< version> 2.2.4< / version>
< /依赖关系>

以下是测试代码:

 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;
$ b公共ParentClass(){
}

公共ParentClass(MyClass myClass){
this.myClass = myClass;
}
}

公共类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()); //空引用
Assert.assertEquals(0,v.validate(new ParentClass(new MyClass()))。size()); //有效引用,空字段
Assert.assertEquals(1,v.validate(new ParentClass(new MyClass(I fail)))。size());
Assert.assertEquals(0,v.validate(new ParentClass(new MyClass(1 pass)))。size());
}
}

我希望这会有所帮助。看来(对我来说)所表现的行为是正确的。


I want to validate the myClass variable. The trouble is that myClass can be either null or a reference to a myClass object. If it is a reference I want it to validate the object, if it is null obviously no validation should occur.

The following works but myClass cannot be null.

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


public MyClass {

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

}

If I remove the @NotNull annotation from ParentClass it no longer performs validation even if I keep the @Valid annotation.

public class ParentClass {
    @Valid
    private MyClass myClass;
}


public MyClass {

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

}

Is is possible to validate an optionally null field using jpa/hibernate annotations?

解决方案

When you say that this validation never takes place are you referring to situations where myField is null or populated (or either)?

As I am also using the Validator on one of my projects, I ran a little test and when myField is null, it is not validated. When it is not null, it is. I am using the following versions:

<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>

Here is the test code:

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());
    }
}

I hope this helps. It seems (to me) the behaviour demonstrated is correct.

这篇关于Hibernate验证 - 只验证对象是否为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆