1. 简介

在本教程中,我们将学习如何在 Spring MVC 中对 HTTP 请求参数(@RequestParam)和路径变量(@PathVariable)进行校验。

我们将重点介绍如何使用 JSR 303 注解 来校验 StringNumber 类型的参数。

如果你对其他类型的校验感兴趣,可以参考我们之前的文章: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 获取。


原始标题:Validating RequestParams and PathVariables in Spring | Baeldung