SpringBoot 参数解析 HandlerMethodArgumentResolver
SpringMVC提供了各种姿势的http参数解析支持,GET/POST参数解析篇也可以看到,加一个@RequsetParam
注解就可以将方法参数与http参数绑定,看到这时自然就会好奇这是怎么做到的,我们能不能自己定义一种参数解析规则呢?
将介绍如何实现自定义的参数解析,并让其生效
I. 环境搭建
首先得搭建一个web应用才有可能继续后续的测试,借助SpringBoot搭建一个web应用属于比较简单的活;
创建一个maven项目,pom文件如下
1 | xml复制代码<parent> |
II. 自定义参数解析器
对于如何自定义参数解析器,一个较推荐的方法是,先搞清楚springmvc接收到一个请求之后完整的处理链路,然后再来看在什么地方,什么时机,来插入自定义参数解析器,无论是从理解还是实现都会简单很多。遗憾的是,本篇主要目标放在的是使用角度,所以这里只会简单的提一下参数解析的链路,具体的深入留待后续的源码解析
1. 参数解析链路
http请求流程图:
既然是参数解析,所以肯定是在方法调用之前就会被触发,在Spring中,负责将http参数与目标方法参数进行关联的,主要是借助org.springframework.web.method.support.HandlerMethodArgumentResolver
类来实现
1 | less复制代码/** |
上面这段核心代码来自org.springframework.web.method.support.HandlerMethodArgumentResolverComposite#resolveArgument
,主要作用就是获取一个合适的HandlerMethodArgumentResolver
,实现将http参数(webRequest
)映射到目标方法的参数上(parameter
)
所以说,实现自定义参数解析器的核心就是实现一个自己的HandlerMethodArgumentResolver
2. HandlerMethodArgumentResolver
实现一个自定义的参数解析器,首先得有个目标,我们在get参数解析,当时遇到了一个问题,当传参为数组时,定义的方法参数需要为数组,而不能是List,否则无法正常解析;现在我们则希望能实现这样一个参数解析,以支持上面的场景
为了实现上面这个小目标,我们可以如下操作
a. 自定义注解ListParam
定义这个注解,主要就是用于表明,带有这个注解的参数,希望可以使用我们自定义的参数解析器来解析;
1 | less复制代码@Target(ElementType.PARAMETER) |
b. 参数解析器ListHandlerMethodArgumentResolver
接下来就是自定义的参数解析器了,需要实现接口HandlerMethodArgumentResolver
1 | ini复制代码public class ListHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { |
上面有两个方法:
supportsParameter
就是用来表明这个参数解析器适不适用
+ 实现也比较简单,就是看参数上有没有前面定义的`ListParam`注解
resolveArgument
这个方法就是实现将http参数粗转换为目标方法参数的具体逻辑
+ 上面主要是为了演示自定义参数解析器的过程,实现比较简单,默认只支持`List<String>`
3. 注册
上面虽然实现了自定义的参数解析器,但是我们需要把它注册到HandlerMethodArgumentResolver
才能生效,一个简单的方法如下
1 | scala复制代码@SpringBootApplication |
4. 测试
为了验证我们的自定义参数解析器ok,我们开两个对比的rest服务
1 | typescript复制代码@RestController |
演示demo如下,添加了ListParam
注解的可以正常解析,没有添加注解的会抛异常
II. 其他
本文转载自: 掘金