Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
282 views
in Technique[技术] by (71.8m points)

java - Hibernate validation - only validate if object is not null

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...