在Spring中验证RequestParams和PathVariables

2023/05/19

1. 简介

在本教程中,我们将学习如何在Spring MVC中验证HTTP请求参数和路径变量。

具体来说,我们将 使用JSR 303注解验证String和Number参数。

要探索其他类型的验证,我们可以参考我们关于Java Bean验证方法约束的教程,或者我们可以学习如何创建我们自己的验证器

2. 配置

要使用Java验证API,我们必须添加一个JSR 303实现,例如hibernate-validator

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.10.Final</version>
</dependency>

我们还必须通过添加@Validated注解来为我们的控制器中的请求参数和路径变量启用验证:

@RestController
@RequestMapping("/")
@Validated
public class Controller {
    // ...
}

请务必注意,启用参数验证还需要一个MethodValidationPostProcessor bean。如果我们使用的是Spring Boot应用程序,那么这个bean是自动配置的,因为我们在类路径上有hibernate-validator依赖项。

否则,在标准的Spring应用程序中,我们必须显式添加此bean:

@EnableWebMvc
@Configuration
@ComponentScan("cn.tuyucheng.taketoday.spring")
public class ClientWebConfigJava implements WebMvcConfigurer {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
    // ...
}

默认情况下,Spring中路径或请求验证期间的任何错误都会导致HTTP 500响应。在本教程中,我们将使用ControllerAdvice的自定义实现以更具可读性的方式处理这些类型的错误,并为任何错误请求返回HTTP 400。我们可以在GitHub上找到这个解决方案的源代码。

3. 验证RequestParam

让我们考虑一个例子,我们将一个数字工作日作为请求参数传递给控制器方法:

@GetMapping("/name-for-day")
public String getNameOfDayByNumber(@RequestParam Integer dayOfWeek) {
    // ...
}

我们的目标是确保dayOfWeek的值在1到7之间。为此,我们将使用@Min和@Max注解:

@GetMapping("/name-for-day")
public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {
    // ...
}

任何不符合这些条件的请求都将返回带有默认错误消息的HTTP状态400。

例如,如果我们调用http:// localhost:8080/name-for-day?dayOfWeek=24,响应消息将是:

getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7

我们可以通过添加自定义消息来更改默认消息:

@Max(value = 1, message = "day number has to be less than or equal to 7")

4. 验证PathVariable

与@RequestParam一样,我们可以使用javax.validation.constraints包中的任何注解来验证@PathVariable。

让我们考虑一个示例,在该示例中我们验证String参数不为空且长度小于或等于10:

@GetMapping("/valid-name/{name}")
public void createUsername(@PathVariable("name") @NotBlank @Size(max = 10) String username) {
    // ...
}

例如,任何名称参数超过10个字符的请求都将导致HTTP 400错误并显示一条消息:

createUser.name:size must be between 0 and 10

通过在@Size注解中设置消息参数,可以轻松覆盖默认消息。

5. 总结

在本文中,我们学习了如何在Spring应用程序中验证请求参数和路径变量。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章