一个好用的SpringBoot参数处理器-HandlerMethodArgumentResolver

昨天查资料,偶然看到了一篇介绍处理分页参数的文章 - 我再也不想写@RequestParam("current")了

我本来想着处理分页参数不是用封装的方式就可以了吗,但是想着万一人家有更加隐式的方式呢,就点进去看了一下。

果然,里面介绍了一个我没有用过的接口- HandlerMethodArgumentResolver

这个类就很有意思,可以拦截接口参数,并修改入参值。

那我们就直接开始。

接口源码

源码非常简单,一看就知道怎么用的了:

java 复制代码
public interface HandlerMethodArgumentResolver {
    boolean supportsParameter(MethodParameter parameter);

    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

首先supportsParameter就是判断接口参数是否需要进行处理,也就是执行resolveArgument方法。这里的入参MethodParameter就包含了调用的方法和处理的参数。

resolveArgument就是对这个入参进行处理,入参就是一堆请求信息,而出参就是对参数的设定值。

举例

我们知道@RequestParam可以设定默认值,那么对于@RequestBody该怎样设定默认值呢?可以这样:

java 复制代码
public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 只对被@RequestBody注解标记的参数进行默认值注入
        return parameter.hasParameterAnnotation(RequestBody.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        Object value = getValue(parameter, webRequest);
        // TODO: modify value
        return value;
    }
    
    private Object getValue(MethodParameter parameter, NativeWebRequest request) {
        // TODO: 从request解析出parameter对应的值
        return null;
    }
}

使用

当然,我们只定义了一个参数处理器是不够的,SpringBoot并不会直接把这个实现类拿来用,我们还需要手动把实现类添加到处理器列表中:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new MyHandlerMethodArgumentResolver());
    }
}

其他

WebMvcConfigurer可以看出,里面其实还有很多的add方法,例如addReturnValueHandlers就是对应的更改方法返回值。

相关推荐
bug攻城狮9 小时前
Spring Boot应用内存占用分析与优化
java·jvm·spring boot·后端
迪巴拉15259 小时前
基于Vue与Spring Boot+Open Cv的智慧校园考勤系统
前端·vue.js·spring boot
me83210 小时前
【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程
java·spring boot·nginx
韩立学长11 小时前
基于Springboot校园志愿者服务平台77pz7812(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
qq_124987075311 小时前
基于SpringBoot微信小程序的智能在线预约挂号系统(源码+论文+部署+安装)
spring boot·后端·微信小程序·毕业设计·计算机毕设·毕业设计源码
小马爱打代码11 小时前
SpringBoot + 异地多活 + 消息回放:金融级数据一致性容灾架构设计与演练
spring boot·金融
AD钙奶-lalala13 小时前
SpringBoot 4.0.3配置Swagger
java·spring boot·后端
随机昵称_12345614 小时前
springboot导出带水印文字的xlsx
java·spring boot·后端
小马爱打代码14 小时前
SpringBoot + JVM 内存泄漏监控 + Heap Dump 自动采集:OOM 前自动预警并留存现场
jvm·spring boot·后端
Lyyaoo.14 小时前
What is Maven?
java·spring boot·maven