实现自定义的参数解析器——HandlerMethodArgumentResolver
1.为什么需要自己实现参数解析器
我们都知道在有注解的接口方法中加上@RequestBody等注解,springMVC会自动的将消息体等地方的里面参数解析映射到请求的方法参数中。
如果我们想要的信息不完全是来自消息体等地方,比如说一部分是消息体,一部分是消息头,甚至一部分从配置中获取。这个时候我们又希望在方法入参进来就将这些信息组装好。或者说是需要从消息头里面去进行token解析认证的时候。
2. HandlerMethodArgumentResolver接口
实现HandlerMethodArgumentResolver来扩展自己的参数解析器。该接口有两个方法supportsParameter和resolveArgument我们需要重写这两个方法。

supportsParameter是条件,只有这个方法返回true的时候。才会在调用resolveArgument方法进行参数解析。
Spring源码中对这两个方法的调用:

3.实现自己的参数解析器:
package com.nijunyang.springboot.argsresolver; import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
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; import javax.servlet.http.HttpServletRequest; /**
* @author: create by nijunyang
* @date:2019/11/30
*/
public class DefArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//方法参数是User 则使用此解析器
return User.class.isAssignableFrom(methodParameter.getParameterType());
} @Nullable
@Override
public Object resolveArgument(
MethodParameter methodParameter,
@Nullable ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
@Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest servletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
String info = (String) nativeWebRequest.getAttribute("params", NativeWebRequest.SCOPE_REQUEST);
//获取消息头认证信息,没有后续操作了,根据业务实际来解析校验该token
String token = servletRequest.getHeader("Authorization");
//自己塞数据进去,也可以从配置文件获取数据
return new User("zhangsan",18); }
}
4.将自己的解析器加入到容器的解析器集合中
package com.nijunyang.springboot.argsresolver; import org.springframework.stereotype.Component;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; /**
* @author: create by nijunyang
* @date:2019/11/30
*/
@Component
//一定要将自己的扩展类加到容器中
public class DefWebMvcConfigurer implements WebMvcConfigurer { public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new DefArgumentResolver());
}
}
当然也可以用注解的形式注入到DefWebMvcConfigurer 中在添加到集合中,同时还可以在DefArgumentResolver 中获取配置的信息。
5.Test
package com.nijunyang.springboot.argsresolver; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author: create by nijunyang
* @date:2019/11/30
*/
@RestController
public class Controller { @GetMapping("/test")
public String test(User user){
return user.toString();
}
}
6.效果:

直接可以获取到我们自定返回的对象。
实现自定义的参数解析器——HandlerMethodArgumentResolver的更多相关文章
- 一步一步自定义SpringMVC参数解析器
随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...
- 自定义springmvc参数解析器
实现spring HandlerMethodArgumentResolver接口 通过使用@JsonArg自定义注解来解析json数据(通过fastjson的jsonPath),支持多个参数(@Req ...
- Spring boot中自定义Json参数解析器
转载请注明出处... 一.介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 /** * 请求路径 http://127.0. ...
- SpringMVC自动封装List对象 —— 自定义参数解析器
前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.sp ...
- SpringMVC 自定义参数解析器.
一.简述 有没有想过像 @RequestParam.@RequestBody 这些注解的工作原理呢?为什么 form 表单.application/json 的参数能够直接封装进 Bean 对象中呢? ...
- SpringBoot系列教程web篇之如何自定义参数解析器
title: 190831-SpringBoot系列教程web篇之如何自定义参数解析器 banner: /spring-blog/imgs/190831/logo.jpg tags: 请求参数 cat ...
- springmvc 源码分析(三) -- 自定义处理器映射器和自定义处理器适配器,以及自定义参数解析器 和错误跳转自定页面
测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git DispatcherServlet ...
- 自定义HandlerMethodArgumentResolver参数解析器和源码分析
在初学springmvc框架时,我就一直有一个疑问,为什么controller方法上竟然可以放这么多的参数,而且都能得到想要的对象,比如HttpServletRequest或HttpServletRe ...
- HandlerMethodArgumentResolver 参数解析器
关于springMvc中的参数解析器 springMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver(对参数的解析器) HandlerMet ...
随机推荐
- 总结Java equals()和hashCode()的联系
Java equals()和hashCode()的联系 如果两个对象是相等的,那么它们必须有相同的哈希码. 如果两个对象具有相同的哈希码,他们可能相等,可能不相等. 如果两个对象是不同的类的实例 他们 ...
- 时针.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 前端组件用 Scope 发布 npm 包的方法
1.引言 多人.多组织或多组件发布 npm 包到同一个仓库时,可能出现命名冲突问题. 为了解决这个问题,npm 引入了“scope”(范围)概念. 在 Angular 项目中,我们通常可以看到“@an ...
- CSPS模拟99
555我原型笔录 T1 不会线段树维护单调栈被dalao们踩爆 T2 我要实现这样一个东西: 已知a,b,c,使a=a-b,b=b-c 结果我把代码弄成这样: b=b-c;a=a-b; 然后就被dal ...
- GitHub_Hexo_Next 搭建博客
利用最新版本的 hexo+next 重构了个人博客,下面简单记录了搭建博客的完整过程: 一.环境准备 1.安装 Node.js 2.安装 Git 3.注册 Github 账号 二.在GitHub上创建 ...
- 基本数据类型(While循环,For循环,列表以及相关用法)
正常在没有学习循环情况下,我们要输出同样的语句,需要重复打印.相当重要!!!! While循环 将输出放在一行 end=""默认是换行 print("Hello Worl ...
- 『题解』洛谷P1993 小K的农场
更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...
- flask-sqlalchemy 迁移数据(生成数据库表)与 查询数据
1, 生成表 db.Model主要用于数据库的增删改查操作, 构建表交给db.Table完成 安装 pip install flask-migrate from datetime import dat ...
- fatal: Authentication failed for 'http://git
git pull 出现 fatal: Authentication failed for 'http://git... git config --system --unset credential.h ...
- linux下的压缩解压命令
.gz解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileName .tar.gz 和 .tgz解压:tar zxvf FileName. ...