2013-07-10 13 views
5

myClass değişkenini doğrulamak istiyorum. Sorun şu ki, myClass, bir myClass nesnesine null veya referansı olabilir. Bir referans ise, nesneyi doğrulamak istiyorum, eğer açık değilse, doğrulama yapılmamalıdır.Hazırda bekletme doğrulaması - yalnızca nesne sıfır değilse doğrulayın

Aşağıdaki işler ancak myClass , yapamazsınız. Ben ParentClass den @NotNull ek açıklama kaldırırsanız

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


public MyClass { 

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

} 

artık ben @Valid ek açıklama tutmak bile doğrulama gerçekleştirir.

public class ParentClass { 
    @Valid 
    private MyClass myClass; 
} 


public MyClass { 

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

} 

JPA/ek açıklamalar hazırda kullanılarak isteğe bağlı olarak boş alanı doğrulamak mümkündür mi?

+0

@Size (min = 3) 'ile aynı sorun. Henüz bir çözüm bulamadım! –

cevap

5

Bunu this validation never takes place belirttiğinizde myField'in null veya popüle olduğu durumlara mı atıfta bulunuyorsunuz (veya)?

Ayrıca projelerimden birinde Doğrulayıcı'yı kullandığım için, biraz test yaptım ve myField boş olduğunda, doğrulanmadı. Ne zaman boş değil, öyle. Aşağıdaki sürümleri kullanıyorum:

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

İşte Test kodudur:

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

umarım bu yardımcı olur. Görünen davranış doğru görünüyor.

+0

Doğrulamayı tetiklemek için ek açıklamalar kullanıldığında boş gösterici istisnasından nasıl kaçınıyorsunuz (veya işlenmekte)? – Noremac

+1

@Noremac [Bean Validator Spec] (http://beanvalidation.org/1.1/spec/) (3.20 no'lu bir not olarak), "boş bir parametrede true döndürmek" için en iyi uygulama olduğunu söylüyor. Örneğimde olduğu gibi, [Hazırda Bekletme Doğrulayıcısı] (http://goo.gl/wUdquI) bunu yapar. Spesifikasyon ayrıca "Zorunlu olmamakla birlikte, çekirdek kısıtlama onaylama işleminin null kısıtlama validasyonundan ayrılması için iyi bir uygulama olarak kabul edilmektedir" ve "Her iki endişeyi ayırmak iyi bir uygulamadır." Nihayetinde olsa da, uygulamaya bağlıdır ve eğer uygulayıcılar bu en iyi uygulamayı izlerlerse. – Brice

İlgili konular