@Min 和 @Max 必须作用于 DTO 类的字段(或 getter),配合 @Valid/@Validated 触发校验才生效;不能直接标注在 Controller 方法的原始类型参数上,否则无效。

Java 中用 @Min 和 @Max 限制数字参数的取值范围,核心是结合 Bean Validation(JSR 303/380)注解 + 参数校验机制,不能直接加在普通方法参数上就生效,需要配合校验触发点(如 Spring MVC 的 @Valid、@Validated 或手动调用 Validator)。
必须作用在受管对象的字段上
@Min 和 @Max 是字段级约束注解,只能标注在 JavaBean 的成员变量(或 getter 方法)上,不能直接写在 Controller 方法的原始类型参数(如 int age)前面。
- ✅ 正确:定义一个 DTO 类,在字段上加注解
- ❌ 错误:
public String handle(@Min(1) @Max(100) int score)—— 这样不生效
Spring Boot 中典型用法(Controller 层)
在 Spring MVC 场景下,最常用的是将参数封装成对象,并在类中使用注解,再配合 @Valid 触发校验:
public class ScoreRequest {
@Min(value = 0, message = "分数不能小于0")
@Max(value = 100, message = "分数不能大于100")
private int score;
// getter/setter
}
Controller 中这样接收并校验:
立即学习“Java免费学习笔记(深入)”;
@PostMapping("/submit")
public ResponseEntity<String> submit(@Valid @RequestBody ScoreRequest request) {
return ResponseEntity.ok("ok");
}
如果 JSON 中 score 超出范围,Spring 会自动返回 400,并携带错误信息(需配置全局异常处理器解析 MethodArgumentNotValidException)。
支持的数字类型
@Min 和 @Max 支持以下类型(无需额外转换):
-
byte、short、int、long -
BigInteger、BigDecimal -
float、double(⚠️ 注意浮点精度问题,建议优先用BigDecimal表达精确范围)
不支持 String 类型字段 —— 即使内容是数字,也不能直接用 @Min/@Max 校验,需先转为数值类型或用 @Pattern + 正则。
自定义校验或非对象参数怎么办?
如果确实要校验单个路径变量或查询参数(如 @PathVariable("id") Long id),可:
- 改用
@PathVariable+ 封装到 DTO(推荐) - 用 Spring 的
@Validated配合分组 + 方法级校验(需实现ConstraintValidator并配合 AOP) - 手动校验:注入
Validator,调用validateValue()方法校验单个值
例如手动校验一个 int:
Set<ConstraintViolation<Object>> violations =
validator.validateValue(ScoreRequest.class, "score", 150);
不复杂但容易忽略:注解本身只是“声明”,真正起作用靠校验器执行。没触发校验,加多少 @Min 都无效。


















