2013-07-10 13 views
5

Chcę zweryfikować zmienną myClass. Problem polega na tym, że myClass może być albo null lub odniesienia do obiektu myClass. Jeśli jest to odwołanie, chcę, aby sprawdził poprawność obiektu, jeśli jest to wartość pusta, w oczywisty sposób nie powinno dojść do sprawdzenia poprawności.Sprawdzanie hibernacji - sprawdzanie poprawności tylko wtedy, gdy obiekt nie jest pusty.

Następujące prace, ale myClass nie mogą być puste.

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


public MyClass { 

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

} 

Jeśli usunąć @NotNull adnotacji z ParentClass już nie wykonuje walidacji nawet gdybym zachować @Valid adnotacji.

public class ParentClass { 
    @Valid 
    private MyClass myClass; 
} 


public MyClass { 

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

} 

Czy istnieje możliwość sprawdzania pola opcjonalnie pustego przy użyciu adnotacji jpa/hibernate?

+0

Ten sam problem z '@Size (min = 3)'. Nie znalazłem jeszcze rozwiązania !! –

Odpowiedz

5

Kiedy mówisz, że this validation never takes place odnosisz się do sytuacji, w których myField ma wartość zerową lub jest zapełniony (czy też jest)?

Ponieważ używam walidatora w jednym z moich projektów, wykonałem mały test, a gdy moja wartość jest zerowa, nie jest ona sprawdzana. Kiedy nie jest zerowy, jest. Używam następujących wersjach:

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

Oto kod testu:

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

Mam nadzieję, że to pomaga. Wydaje mi się, że przedstawione zachowanie jest poprawne.

+0

Jak można uniknąć (lub obsługiwać) wyjątku wskaźnika pustego, gdy adnotacje są używane do wyzwalania sprawdzania poprawności? – Noremac

+1

@Noremac [Bean Validator Spec] (http://beanvalidation.org/1.1/spec/) mówi (jako notatkę na przykład 3.20), że najlepszą praktyką jest "zwracanie wartości true przy parametrze zerowym". Tak jak w moim przykładzie, robi to [Walidacja wzorca hibernacji] (http://goo.gl/wUdquI). Specyfikacja również stwierdza: "Chociaż nie jest to obowiązkowe, dobrą praktyką jest dzielenie weryfikacji zasadniczego ograniczenia z walidacji braku wartości zerowej" oraz "Oddzielne obawy są dobrą praktyką". Ostatecznie jednak zależy to od implementacji i jeśli implementatorzy przestrzegają tej najlepszej praktyki. – Brice

Powiązane problemy