JSR 303: How to Validate a Collection of annotated objects?

后端 未结 5 1340
悲&欢浪女
悲&欢浪女 2020-12-14 14:17

Is it possible to validate a collection of objects in JSR 303 - Jave Bean Validation where the collection itself does not have any annotations but the elements contained wit

相关标签:
5条回答
  • 2020-12-14 14:43

    Yes, just add @Valid to the collection.

    Here is an example from the Hibernate Validator Reference.

    public class Car {
      @NotNull
      @Valid
      private List<Person> passengers = new ArrayList<Person>();
    }
    

    This is standard JSR-303 behavior. See Section 3.1.3 of the spec.

    0 讨论(0)
  • 2020-12-14 14:46

    You, can also add @NotEmpty to the collection.

    public class Car {
      @NotEmpty(message="At least one passenger is required")
      @Valid
      private List<Person> passengers = new ArrayList<Person>();
    }
    

    this will ensure at least one passenger is present, and the @Valid annotation ensures that each Person object is validated

    0 讨论(0)
  • 2020-12-14 14:48

    You can of course also just iterate over the list and call Validator.validate on each element. Or put the List into some wrapper bean and annotate it with @Valid. Extending ArrayList for validation seems wrong to me. Do you have a particular use case you want to solve with this? If so maybe you can explain it a little more. To answer your initial question:

    Is it possible to validate a collection of objects in JSR 303 - Jave Bean Validation where the collection itself does not have any annotations but the elements contained within do?

    No

    0 讨论(0)
  • 2020-12-14 14:52

    I wrote this generic class:

    public class ValidListWrapper<T> {
    
        @Valid
        private List<T> list;
    
        public ValidListWrapper(List<T> list) {
            this.list = list;
        }
    
        public List<T> getList() {
            return list;
        }
    
    }
    

    If you are using Jackson library to deserialize JSON you can add @JsonCreator annotation on the constructor and Jackson will automatically deserialize JSON array to wrapper object.

    0 讨论(0)
  • 2020-12-14 14:59

    As of Bean Validator 2.0, both of these approaches work:

    class MyDto {
    
        private List<@Valid MyBean> beans;
    }
    

    and

    class MyDto {
    
        @Valid
        private List<MyBean> beans;
    }
    
    0 讨论(0)
提交回复
热议问题