在spring-boot中,用validation对属性值进行校验,对于list类型的成员,即使用@Valid,校验仍然失败,打印出的报错信息如下
但是经过检查,该list对象是有值的。如果把list的校验的注释掉,数据能成功保存到数据库中
请问有遇见过相同情况的同学么?请赐教下,谢谢啦~
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;试试。
自顶~~~
有没有哪位高手指点下哈