You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何组合两个字段使用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:36:04