6 votes

Hibernate validation - ne vérifier que si l'objet n'est pas nul

Je veux valider la variable myClass. Le problème est que myClass peut être soit null soit une référence à un objet myClass. Si c'est une référence, je veux valider l'objet, mais si c'est null, aucune validation ne doit avoir lieu.

La solution suivante fonctionne, mais myClass ne peut pas être null.

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

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

Si je supprime l'annotation @NotNull de ParentClass, la validation ne se fait plus même si je garde l'annotation @Valid.

public class ParentClass {
    @Valid
    private MyClass myClass;
}

public MyClass {
    @Pattern(regexp="\\d.{10}") // cette validation ne se déclenche jamais
    private String myField;
}

Est-il possible de valider un champ éventuellement nul en utilisant des annotations JPA/hibernate?

7voto

Brice Points 88

Lorsque vous dites que cette validation ne se produit jamais, faites-vous référence aux situations où myField est nul ou rempli (ou à l'un ou l'autre)?

Comme j'utilise également le Validator sur l'un de mes projets, j'ai fait un petit test et lorsque myField est nul, il n'est pas validé. Quand il n'est pas nul, il l'est. J'utilise les versions suivantes:

    javax.validation
    validation-api
    1.1.0.Final

    org.hibernate
    hibernate-validator
    5.0.1.Final

    javax.el
    javax.el-api
    3.0.0

    org.glassfish.web
    javax.el
    2.2.4

Voici le code de test:

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()); // Référence nulle
        Assert.assertEquals(0, v.validate(new ParentClass(new MyClass())).size()); // Référence valide, champ nul
        Assert.assertEquals(1, v.validate(new ParentClass(new MyClass("I fail"))).size());
        Assert.assertEquals(0, v.validate(new ParentClass(new MyClass("1 pass"))).size());
    }
}

J'espère que cela vous aidera. Il me semble que le comportement démontré est correct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X