在 spring boot 中校验数值范围,最直接的方法是在实体类的字段上添加 @min 和 @max 注解。配合 @validated 或 @valid 使用,框架会自动拦截超出范围的输入并抛出异常。若需自定义错误信息,可通过 message 属性指定。

@Min 和 @Max 的基本用法是什么
这两个注解分别用于限制数值的下界和上界。它们支持整数、浮点数及包装类型。当请求参数不符合约束时,Spring Boot 会返回 HTTP 400 状态码。默认情况下,错误消息由 Hibernate Validator 提供,格式固定为 "must be greater than or equal to [value]" 等。

import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
public class UserRequest {
@Min(value = 18, message = "年龄必须大于等于18")
@Max(value = 100, message = "年龄必须小于等于100")
private Integer age;
@Min(value = 0.0, message = "余额不能为负")
private Double balance;
}
上述代码定义了 UserRequest 类。其中 age 字段被限制在 18 到 100 之间。balance 字段要求非负。调用方传入 age=15 时,校验失败,触发 ConstraintViolationException。
如何全局处理校验失败的异常
为了让 API 返回统一的 JSON 结构,需要捕获 MethodArgumentNotValidException 或 ConstraintViolationException。通过 @ControllerAdvice 定义全局异常处理器,提取错误详情并封装为响应对象。这样前端无需解析原始堆栈,直接获取字段级错误列表。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.validation.BindException;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<string> handleValidation(MethodArgumentNotValidException ex) {
StringBuilder sb = new StringBuilder();
ex.getBindingResult().getFieldErrors().forEach(error -> {
sb.append(error.getField()).append(": ").append(error.getDefaultMessage()).append("\n");
});
return ResponseEntity.badRequest().body(sb.toString());
}
}</string>
该处理器拦截了绑定异常。遍历 getFieldErrors() 收集所有字段的错误信息。返回的 Body 包含每个字段的违规描述。例如 age: 年龄必须大于等于18。这种方式简化了客户端的错误处理逻辑。
如果数值为 null,校验会生效吗
默认情况下,@Min 和 @Max 不处理 null 值。如果字段允许为空,需额外添加 @Null 或 @NotBlank(针对字符串)来明确意图。若未添加任何空值检查,null 会通过范围校验,但可能在后续业务逻辑中引发 NullPointerException。建议在 DTO 中显式声明 @NotNull 以区分“未提供”和“提供但无效”两种情况。











