通过实现 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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端