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
相关产品推荐
相关产品推荐

