1. 简介
在本教程中,我们将学习如何在 Spring MVC 中对 HTTP 请求参数(@RequestParam
)和路径变量(@PathVariable
)进行校验。
我们将重点介绍如何使用 JSR 303 注解 来校验 String
和 Number
类型的参数。
如果你对其他类型的校验感兴趣,可以参考我们之前的文章:Java Bean 校验、方法参数约束,或者了解如何 自定义校验器。
2. 配置准备
要使用 Java Bean Validation API,我们需要引入一个 JSR 303 的实现,例如 *hibernate-validator*:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
✅ 关键点:要让请求参数和路径变量的校验生效,必须在 Controller 类上加上 @Validated
注解:
@RestController
@RequestMapping("/")
@Validated
public class RequestAndPathVariableValidationController {
// ...
}
⚠️ 注意:启用参数校验还需要配置 MethodValidationPostProcessor
这个 Bean。
- 如果是 Spring Boot 项目,且引入了
hibernate-validator
,该 Bean 会自动配置。 - 如果是传统 Spring 项目,则需要手动添加:
@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.spring")
public class ClientWebConfigJava implements WebMvcConfigurer {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
// ...
}
默认情况下,Spring 中路径变量或请求参数校验失败会返回 HTTP 500 错误。为了更友好地处理这类错误,我们建议使用自定义的 @ControllerAdvice
来捕获校验异常,并返回 HTTP 400 状态码。
本教程的完整代码可以在 GitHub 找到。
3. 校验 @RequestParam
来看一个例子:我们通过请求参数传入一个表示星期几的数字,并希望它在 1 到 7 之间:
@GetMapping("/name-for-day")
public String getNameOfDayByNumberRequestParam(@RequestParam Integer dayOfWeek) {
// ...
}
为了实现校验,我们可以使用 @Min
和 @Max
注解:
@GetMapping("/name-for-day")
public String getNameOfDayByNumberRequestParam(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {
// ...
}
如果传入的参数不满足条件,比如访问 http://localhost:8080/name-for-day?dayOfWeek=24,则会返回 HTTP 400 和默认错误信息。
我们也可以自定义错误提示:
@Max(value = 7, message = "星期数必须小于等于7")
4. 校验 @PathVariable
和 @RequestParam
类似,我们可以使用 jakarta.validation.constraints
包中的任意注解来校验 @PathVariable
。
举个例子,我们要校验路径中的用户名不为空且长度不超过 10:
@GetMapping("/valid-name/{name}")
public void validStringRequestParam(@PathVariable("name") @NotBlank @Size(max = 10) String username) {
// ...
}
如果传入的 name
超过 10 个字符,例如 /valid-name/thisIsTooLong
,则会返回 HTTP 400 错误,并附带默认错误信息。
当然,我们也可以通过 message
属性来自定义提示:
@Size(max = 10, message = "用户名长度不能超过10个字符")
5. 总结
本文介绍了如何在 Spring 应用中对请求参数和路径变量进行参数校验,使用的是标准的 JSR 303 注解,如 @Min
、@Max
、@NotBlank
和 @Size
。
通过合理使用这些注解,可以有效提升接口健壮性,避免非法参数进入业务逻辑。
所有代码示例均可在 GitHub 获取。