如何让Javax Validation同时校验子类与父类?
解决Spring Controller继承校验问题
问题现象
使用Spring开发时,Controller方法中用@Valid校验子类PayDetail.Request时,仅能校验子类自身的字段,父类CommReqForm的字段校验不生效。
解决方案
可以通过以下几种方式解决:
1. 替换@Valid为@Validated
将Controller参数上的@Valid替换为Spring扩展的@Validated注解,它能正确识别并校验父类继承的字段:
@PostMapping("/pay/detail") public ResponseEntity<PayDetail.Response> getPayDetail( @Validated PayDetail.Request payDetail ) { // ...业务逻辑 }
2. 在父类添加@Valid类级注解
在父类CommReqForm的类级别添加@Valid注解,触发对父类字段的递归校验:
@Data @AllArgsConstructor @NoArgsConstructor @Valid // 添加该注解 public class CommReqForm { @NotEmpty(message = "servicecode not empty") private String servicecode; @NotEmpty(message = "reqtype not empty") private String reqtype; }
3. 在子类添加@Valid类级注解
也可以在子类PayDetail.Request的类级别添加@Valid注解,同样能触发对父类字段的校验:
public class PayDetail { @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Valid // 添加该注解 public static class Request extends CommReqForm { @NotNull(message = "Not null please") private String work_type; } }
注意事项
- 确保项目中已引入校验依赖:如果是Spring Boot项目,需引入
spring-boot-starter-validation;非Spring Boot项目需引入hibernate-validator及相关依赖。 - 校验注解(如
@NotEmpty、@NotNull)本身不需要额外配置,Bean Validation规范会处理继承字段的校验逻辑,上述方法是确保Spring MVC能正确触发全字段校验。
内容的提问来源于stack exchange,提问作者ddaakk
相关产品推荐
相关产品推荐

