Spring Boot如何实现min与max关联字段的联合校验?
Spring Boot 跨字段关联参数校验实现方案
这种涉及两个字段关联的校验规则,无法通过JSR-380(Bean Validation)提供的单字段注解实现,需要自定义类级别的校验注解完成,具体步骤如下:
- 步骤1:定义自定义校验注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MaxGreaterThanMinValidator.class) public @interface MaxGreaterThanMin { // 校验失败默认提示信息 String message() default "max取值必须大于min"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
- 步骤2:编写校验逻辑实现类
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class MaxGreaterThanMinValidator implements ConstraintValidator<MaxGreaterThanMin, Clazz> { @Override public boolean isValid(Clazz clazz, ConstraintValidatorContext context) { // 若字段为null可根据业务需求调整逻辑,这里默认min已通过@Min校验有有效值 if (clazz.getMin() == null || clazz.getMax() == null) { return true; } boolean isValid = clazz.getMax() > clazz.getMin(); // 可选:将校验错误信息绑定到max字段上,而非类级别 if (!isValid) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()) .addPropertyNode("max") .addConstraintViolation(); } return isValid; } }
- 步骤3:给实体类添加自定义校验注解
import javax.validation.constraints.Min; @MaxGreaterThanMin public class Clazz{ // 注意@Min的value为数值类型,无需加引号 @Min(value = 0) private Integer min; private Integer max; // 省略getter、setter方法 }
注意:实体类的字段建议使用包装类型
Integer而非基础类型int,避免基础类型默认值0导致的非预期校验问题。
- 步骤4:触发校验
在Controller接口的实体参数前添加@Valid或@Validated注解即可自动触发校验规则:
@PostMapping("/test") public String test(@Valid @RequestBody Clazz clazz) { // 业务逻辑 return "success"; }
内容的提问来源于stack exchange,提问作者majid_shoorabi
相关产品推荐
相关产品推荐

