请教关于Spring Boot 实体里的List集合参数验证失败的问题

在spring-boot中,用validation对属性值进行校验,对于list类型的成员,即使用@Valid,校验仍然失败,打印出的报错信息如下

但是经过检查,该list对象是有值的。如果把list的校验的注释掉,数据能成功保存到数据库中

请问有遇见过相同情况的同学么?请赐教下,谢谢啦~

img

img

img

TacoOrder 类

@Table(name="t_taco_order")
@Entity
public class TacoOrder implements Serializable
{

    private static final long serialVersionUID=1L;

    @Id
    private Long id;

    @NotBlank(message="delivery name is required")
    private String deliveryName;

    @NotBlank(message=" street is required")
    private String deliveryStreet;

    @NotBlank(message=" city is required")
    private String deliveryCity;

    @NotBlank(message=" state is required")
    private String deliveryState;

    @NotBlank(message=" zip Code is required")
    private String deliveryZip;

    @CreditCardNumber(message="Not a valid credit card number")//4485250778628609
    private String ccNumber;

    @Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([2-9][0-9])$",
    message="Must be formatted MM/YY")
    private String ccExpiration;

    @Digits(integer = 3,fraction = 0,message  ="Invalid CVV")
    private String ccCvv;

    @OneToMany(mappedBy="order",cascade = CascadeType.ALL)
    @Valid
    @NotEmpty(message = "tacos不能为空")
    @Size(min = 1,message = "至少一个tacos")
    private List<  Taco> tacos = new ArrayList<>();

    public void addTaco(Taco taco)
    {
        this.tacos.add(taco);
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDeliveryName() {
        return deliveryName;
    }

    public void setDeliveryName(String deliveryName) {
        this.deliveryName = deliveryName;
    }

    public String getDeliveryStreet() {
        return deliveryStreet;
    }

    public void setDeliveryStreet(String deliveryStreet) {
        this.deliveryStreet = deliveryStreet;
    }

    public String getDeliveryCity() {
        return deliveryCity;
    }

    public void setDeliveryCity(String deliveryCity) {
        this.deliveryCity = deliveryCity;
    }

    public String getDeliveryState() {
        return deliveryState;
    }

    public void setDeliveryState(String deliveryState) {
        this.deliveryState = deliveryState;
    }

    public String getDeliveryZip() {
        return deliveryZip;
    }

    public void setDeliveryZip(String deliveryZip) {
        this.deliveryZip = deliveryZip;
    }

    public String getCcNumber() {
        return ccNumber;
    }

    public void setCcNumber(String ccNumber) {
        this.ccNumber = ccNumber;
    }

    public String getCcExpiration() {
        return ccExpiration;
    }

    public void setCcExpiration(String ccExpiration) {
        this.ccExpiration = ccExpiration;
    }

    public String getCcCvv() {
        return ccCvv;
    }

    public void setCcCvv(String ccCvv) {
        this.ccCvv = ccCvv;
    }

    public Date getPlacedAt() {
        return placedAt;
    }

    public void setPlacedAt(Date placedAt) {
        this.placedAt = placedAt;
    }

    public List<Taco> getTacos() {
        return tacos;
    }

    public void setTacos(List<Taco> tacos) {
        this.tacos = tacos;
    }

    private Date placedAt =new Date();
}


Taco 类*

@Table(name="t_taco")
@Entity
public class Taco implements Serializable
{
    private static final long serialVersionUID=1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;

    @NotNull
    @Size(min=5,message="Name must be at least 6 characters long")
    private String name;


    private Date createdAt =new Date();

    //@NotNull
   // @Valid
   // @Size(min=1,message="You  must choose at least 1 ingredient")
    @ManyToMany(targetEntity = Ingredient.class,cascade = CascadeType.ALL)
    @JoinTable(name = "t_ingredient_ref",
            joinColumns = {@JoinColumn(name = "taco",referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "ingredient",referencedColumnName = "id")}
    )
    private List<Ingredient> ingredients = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "taco_order")
    private TacoOrder order;

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }



    public TacoOrder getOrder() {
        return order;
    }

    public void setOrder(TacoOrder order) {
        this.order = order;
    }


    public void addIngredient(Ingredient ingredient)
    {
        this.ingredients.add(ingredient);
    }


    public List<Ingredient> getIngredients() {
        return ingredients;
    }

    public void setIngredients(List<Ingredient> ingredients) {
        this.ingredients = ingredients;
    }

}
@OneToMany(mappedBy="order",cascade = CascadeType.ALL)
    @Valid
    @NotEmpty(message = "tacos不能为空")
    @Size(min = 1,message = "至少一个tacos")
    private List<  Taco> tacos = new ArrayList<>();

你的这段代码有问题,因为你这个给tacos属性赋了一空的List的,但是你有在属性校验上要求其不能为空,这这不前后矛盾吗?
你把new ArrayList<>()删掉直接写成private List< Taco> tacos;试试。

自顶~~~
有没有哪位高手指点下哈