java嵌套验证参数不生效的情况
今天在嵌套验证参数(限制参数长度)的时候 ,遇到了注解不生效的情况。
例如:一个实体类A中嵌套了另外一个实体类B。
A:
public class A{ @NotNull(message = "姓名不能为空") private String name; @NotNull(message = "年龄不能为空") private Integer age; @NotEmpty(message = "老师不能为空") private B teacher; }
B:
public class B{ @NotNull(message = "老师名字不能为空") private String tName; @NotNull(message = "老师年龄不能为空") private Integer tAge; @NotNull(message = "课程数量不能为空") @Size(Max=10,message="最大数量为10") private Integer num; }
描述: 要限制"课程数量"的大小,我们加了"@Size"注解,结果是"@Size"不生效。
如果 A实体的 teacher属性不加 @Valid注释,只有@NotNull或@NotBlank,无论controller层入参方法上采用@Validated还是@Valid验证,Spring Validation框架只会对A实体类上的name、age和这两个属性做非空或数量验证。不会对 teacher字段里的 B实体类中的属性字段进行验证。也就是说,controller层方法入参上加 @Validated 或 @Valid ,实际运行上并不会自动对参数进行嵌套验证。
解决方法:
想要实现嵌套验证参数,必须手动在ItemA的teacher字段上明确指出,A实体中teacher字段里面的属性也要进行验证。
由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能。
因此:需要在嵌套验证类的相应字段上加上@Valid注解,并配合controller层入参方法参数上,加上@Validated 或 @Valid注解来进行嵌套验证。 这样就解决了。