Jersey/JAX-RS : How to cascade beans-validation recursively with @Valid automatically?

11,271

Actually, according to the specification, adding @Valid is exactly for this usecase. From the JSR 303 specification:

In addition to supporting instance validation, validation of graphs of object is also supported. The result of a graph validation is returned as a unified set of constraint violations. Consider the situation where bean X contains a field of type Y. By annotating field Y with the @Valid annotation, the Validator will validate Y (and its properties) when X is validated.

...

The @Valid annotation is applied recursively

Share:
11,271
Admin
Author by

Admin

Updated on June 08, 2022

Comments

  • Admin
    Admin about 2 years

    I am validating my POJOs in a REST resource endpoint in 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;
    
        ...
    }
    

    This seems to work fine.

    However, the @Min(0) annotation is only verified if the field inner has the @Valid annotation. It doesn't feel right to add the @Valid annotation to each field which isn't a primitive.

    Is there a way to tell the bean validator to automatically recursively continue the validation, even when no @Valid annotation is present? I would like my POJO to be as following:

    public class POJO {
        @NotNull
        protected final String name;
    
        @NotNull
        protected final POJOInner inner;
    
        ...
    }