springboot如何校验pathvariable的值呢
时间: 2023-07-04 10:24:29 浏览: 42
Spring Boot提供了多种方式来校验PathVariable的值,下面介绍两种比较常见的方式:
1. 使用@PathVariable注解和@Valid注解结合
在Controller方法的参数上使用@PathVariable注解,同时在参数前面加上@Valid注解,并指定校验器,例如:
```java
@GetMapping("/users/{id}")
public User getUserById(@PathVariable @Valid @Pattern(regexp = "\\d+") String id) {
// ...
}
```
上面的代码中,使用@Pattern注解指定了一个正则表达式作为校验器,保证id只能是数字。
2. 自定义注解和拦截器
通过自定义注解和拦截器的方式可以实现更加灵活的校验方式,具体步骤如下:
1)定义注解
```java
@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckPathVariable {
String value() default "";
}
```
2)定义拦截器
```java
@Component
public class CheckPathVariableInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
CheckPathVariable annotation = handlerMethod.getMethodAnnotation(CheckPathVariable.class);
if (annotation != null) {
String value = annotation.value();
if (!StringUtils.isEmpty(value)) {
String pathVariable = (String) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE)
.get(value);
if (pathVariable == null) {
throw new IllegalArgumentException("参数不存在");
}
// 校验pathVariable的值
// ...
}
}
}
return true;
}
}
```
3)在配置类中注册拦截器
```java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private CheckPathVariableInterceptor checkPathVariableInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(checkPathVariableInterceptor);
}
}
```
4)在Controller方法中使用注解
```java
@GetMapping("/users/{id}")
public User getUserById(@PathVariable @CheckPathVariable("id") String id) {
// ...
}
```
上面的代码中,通过自定义注解@CheckPathVariable和拦截器CheckPathVariableInterceptor实现了对PathVariable的校验。