web-dev-qa-db-fra.com

Jersey / JAX-RS: Comment mettre en cascade la validation des beans récursivement avec @Valid automatiquement?

Je valide mes POJO dans un point de terminaison de ressource REST à Jersey:

public class Resource {
    @POST
    public Response post(@NotNull @Valid final POJO pojo) {
        ...
    }
}

public class POJO {
    @NotNull
    protected final String name;

    @NotNull
    @Valid
    protected final POJOInner inner;

    ...
}

public class POJOInner {
    @Min(0)
    protected final int limit;

    ...
}

Cela semble bien fonctionner.

Cependant, l'annotation @Min(0) n'est vérifiée que si le champ inner a l'annotation @Valid. Il ne semble pas juste d'ajouter l'annotation @Valid À chaque champ qui n'est pas une primitive.

Existe-t-il un moyen de dire au validateur de bean de poursuivre automatiquement et récursivement la validation, même si aucune annotation @Valid N'est présente? Je voudrais que mon POJO soit comme suit:

public class POJO {
    @NotNull
    protected final String name;

    @NotNull
    protected final POJOInner inner;

    ...
}
38
Jasar Tolio

En fait, selon la spécification, l'ajout de @Valid est exactement pour ce cas d'utilisation. D'après la spécification JSR 303:

En plus de prendre en charge la validation d'instance, la validation des graphiques d'objet est également prise en charge. Le résultat d'une validation de graphique est renvoyé sous la forme d'un ensemble unifié de violations de contraintes. Considérez la situation où le bean X contient un champ de type Y. En annotant le champ Y avec l'annotation @Valid, le validateur validera Y (et ses propriétés) lorsque X est validé.

...

L'annotation @Valid est appliquée récursivement

26
Erwin de Gier