2013-07-10 5 views
5

Ich möchte die myClass Variable validieren. Das Problem ist, dass myClass entweder null oder Referenz zu einem MyClass-Objekt sein kann. Wenn es eine Referenz ist, möchte ich, dass das Objekt validiert wird, wenn es null ist, sollte offensichtlich keine Validierung stattfinden.Hibernate-Validierung - validiere nur, wenn das Objekt nicht null ist

Folgendes funktioniert, aber myClass kann nicht null sein.

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


public MyClass { 

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

} 

Wenn ich die @NotNull Anmerkung aus ParentClass entfernen Sie es nicht mehr führt die Validierung auch wenn ich die @Valid Anmerkung halten.

public class ParentClass { 
    @Valid 
    private MyClass myClass; 
} 


public MyClass { 

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

} 

Ist es möglich, ein optional Nullfeld mit JPA/Hibernate Annotations zu validieren?

+0

Gleiches Problem mit '@Size (min = 3)'. Ich habe noch keine Lösung gefunden !! –

Antwort

5

Wenn Sie sagen, this validation never takes place beziehen Sie sich auf Situationen, in denen myField null ist oder (oder beides) ausgefüllt ist?

Da ich auch den Validator für eines meiner Projekte verwende, habe ich einen kleinen Test durchgeführt, und wenn myField null ist, wird es nicht validiert. Wenn es nicht null ist, ist es. Ich verwende die folgenden Versionen:

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

Hier ist der Testcode:

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

Ich hoffe, das hilft. Es scheint (für mich) das gezeigte Verhalten korrekt zu sein.

+0

Wie vermeiden oder behandeln Sie die Nullzeigerausnahme, wenn Annotationen zum Auslösen der Validierung verwendet werden? – Noremac

+1

@Noremac Die [Bean Validator Spec] (http://beanvalidation.org/1.1/spec/) sagt (als Anmerkung für Beispiel 3.20), dass es eine bewährte Methode ist, "true für einen Null-Parameter zurückzugeben". Wie in meinem Beispiel tut dies der [Hibernate Pattern Validator] (http://goo.gl/wUdquI). Die Spezifikation merkt auch an: "Obwohl es nicht obligatorisch ist, wird es als eine gute Methode angesehen, die Validierung der Kernbedingung von der Validierung der Nicht-Null-Bedingung zu trennen" und "Trennung beider Probleme ist eine gute Vorgehensweise". Letztendlich hängt es jedoch von der Implementierung ab und ob die Implementierer diese Best Practice befolgen. – Brice

Verwandte Themen