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

Spring Boot中如何对SizingInformation类进行多字段条件校验

解决方案

要实现你需要的校验逻辑,我们可以通过类级别的自定义校验注解来完成,因为这是跨字段的校验需求,单个字段的注解无法满足。

步骤1:创建自定义校验注解

这个注解会标记需要校验的类,并指定对应的校验器实现:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = SizingInformationValidator.class)
@Target({ElementType.TYPE}) // 作用于类级别
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidSizingInformation {
    // 校验失败时的提示信息
    String message() default "Either all sizing1/sizing2/sizing3 must be non-null, or listOfSizing must not be empty";

    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

步骤2:实现校验器逻辑

编写ConstraintValidator的实现类,定义具体的校验规则:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class SizingInformationValidator implements ConstraintValidator<ValidSizingInformation, SizingInformation> {

    @Override
    public boolean isValid(SizingInformation sizingInfo, ConstraintValidatorContext context) {
        // 避免空指针,先判断对象本身是否为null
        if (sizingInfo == null) {
            return false;
        }

        // 条件1:sizing1、sizing2、sizing3均不为null
        boolean allSizingsNonNull = sizingInfo.getSizing1() != null 
                && sizingInfo.getSizing2() != null 
                && sizingInfo.getSizing3() != null;

        // 条件2:listOfSizing不为null且包含至少一个元素
        boolean listHasElements = sizingInfo.getListOfSizing() != null && !sizingInfo.getListOfSizing().isEmpty();

        // 满足任一条件则校验通过
        return allSizingsNonNull || listHasElements;
    }
}

步骤3:修改SizingInformation类

移除原来字段上的@NotNull注解(因为我们不需要强制单个字段非空,而是整体满足任一条件),然后在类上添加自定义的校验注解:

@ValidSizingInformation
public class SizingInformation {
    private String sizing1;
    private String sizing2;
    private String sizing3;
    private List<Sizing> listOfSizing;

    // 请添加必要的构造函数、getter和setter方法
}

步骤4:在Spring Boot中使用校验

在Controller的请求参数上添加@Valid或@Validated注解,触发校验:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;

@RestController
public class SizingController {

    @PostMapping("/submit-sizing")
    public ResponseEntity<String> submitSizingInfo(@Valid @RequestBody SizingInformation sizingInfo) {
        // 处理业务逻辑
        return ResponseEntity.ok("Sizing information is valid");
    }
}

注意事项

  • 必须移除原来字段上的@NotNull,否则即使listOfSizing不为空,三个sizing字段为null时也会触发字段级校验失败,不符合你的需求。
  • 如果需要自定义校验失败的提示信息,可以在@ValidSizingInformation注解中指定message参数。

内容的提问来源于stack exchange,提问作者RAKESH YEDLAPPALLI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:50:27