如何组合两个字段使用@NotEmpty实现同一请求类适配多场景非空校验
解决方案:使用Bean Validation的分组校验功能
JSR-303/JSR-380(即Jakarta Bean Validation,原javax.validation)原生支持分组校验特性,可以实现同一个请求类在不同调用场景下执行不同校验规则的需求,不需要拆分多个独立的请求类,实现步骤如下:
1. 定义校验分组标记接口
无需实现接口逻辑,仅作为分组标识使用:
// 对应methodA的校验分组 public interface GroupA {} // 对应methodB的校验分组 public interface GroupB {}
2. 给请求类的校验注解指定分组
修改ProductRequest类的注解配置,给@NotEmpty指定对应的生效分组:
@Data public class ProductRequest { @NotEmpty(groups = GroupA.class) // 仅GroupA分组下校验code非空 private String code; @NotEmpty(groups = GroupB.class) // 仅GroupB分组下校验name非空 private String name; }
3. 在对应方法指定校验时使用的分组
Spring/SpringBoot Controller场景
直接用@Validated注解指定要触发的校验分组即可:
// methodA触发GroupA规则校验 @PostMapping("/methodA") public void methodA(@RequestBody @Validated(GroupA.class) ProductRequest request) { // 业务逻辑 } // methodB触发GroupB规则校验 @PostMapping("/methodB") public void methodB(@RequestBody @Validated(GroupB.class) ProductRequest request) { // 业务逻辑 }
普通方法手动触发校验场景
拿到Validator实例后调用校验方法时指定分组:
@Autowired private Validator validator; public void methodA(ProductRequest request) { Set<ConstraintViolation<ProductRequest>> violations = validator.validate(request, GroupA.class); if (!violations.isEmpty()) { // 处理校验异常逻辑 } // 业务逻辑 } public void methodB(ProductRequest request) { Set<ConstraintViolation<ProductRequest>> violations = validator.validate(request, GroupB.class); if (!violations.isEmpty()) { // 处理校验异常逻辑 } // 业务逻辑 }
补充说明
- 如果有字段需要在所有场景下都校验,可以不用指定
groups属性,默认归属于Bean Validation内置的Default分组 - 单个校验注解可指定多个分组,示例:
@NotEmpty(groups = {GroupA.class, GroupC.class})
内容的提问来源于stack exchange,提问作者user17186249
相关产品推荐
相关产品推荐

