通过实现 HandlerMethodArgumentResolver 校验 Controller 参数

HandlerMethodArgumentResolver是 Spring MVC 中的一个接口,用于解析控制器方法的参数。

下面演示如何自定义一个@NotBlank注解,并实现相应的HandlerMethodArgumentResolver,来校验前端传递的参数是否为空。

实际项目中已经有现成的注解可用了,这里仅用来演示HandlerMethodArgumentResolver的使用。

1. 创建自定义注解@NotBlank

首先,定义注解@NotBlank,用于标记需要校验的方法参数。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotBlank {
String message() default "不能为空!";
}

2. 创建HandlerMethodArgumentResolver

然后创建一个实现HandlerMethodArgumentResolver的类,该类将进行参数校验。

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class NotBlankArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(NotBlank.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String value = webRequest.getParameter(parameter.getParameterName());
// 参数校验
if (value == null || value.trim().isEmpty()) {
String message = parameter.getParameterAnnotation(NotBlank.class).message();
throw new IllegalArgumentException(message);
}
return value; // 返回原始值,或根据需要转换
}
}

3. 注册解析器

最后,在 Spring 配置中注册自定义的HandlerMethodArgumentResolver

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new NotBlankArgumentResolver());
}
}

4. 使用自定义参数解析器的控制器

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestParam;
@RestController
public class ExampleController {
@GetMapping("/example")
public String example(@RequestParam(value = "input", required = false) @NotBlank String input) {
return "已校验数据:" + input;
}
}
posted @   Higurashi-kagome  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示