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的更多相关文章

  1. 一步一步自定义SpringMVC参数解析器

    随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...

  2. 自定义springmvc参数解析器

    实现spring HandlerMethodArgumentResolver接口 通过使用@JsonArg自定义注解来解析json数据(通过fastjson的jsonPath),支持多个参数(@Req ...

  3. Spring boot中自定义Json参数解析器

    转载请注明出处... 一.介绍 用过springMVC/spring boot的都清楚,在controller层接受参数,常用的都是两种接受方式,如下 /** * 请求路径 http://127.0. ...

  4. SpringMVC自动封装List对象 —— 自定义参数解析器

    前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.sp ...

  5. SpringMVC 自定义参数解析器.

    一.简述 有没有想过像 @RequestParam.@RequestBody 这些注解的工作原理呢?为什么 form 表单.application/json 的参数能够直接封装进 Bean 对象中呢? ...

  6. SpringBoot系列教程web篇之如何自定义参数解析器

    title: 190831-SpringBoot系列教程web篇之如何自定义参数解析器 banner: /spring-blog/imgs/190831/logo.jpg tags: 请求参数 cat ...

  7. springmvc 源码分析(三) -- 自定义处理器映射器和自定义处理器适配器,以及自定义参数解析器 和错误跳转自定页面

    测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git DispatcherServlet ...

  8. 自定义HandlerMethodArgumentResolver参数解析器和源码分析

    在初学springmvc框架时,我就一直有一个疑问,为什么controller方法上竟然可以放这么多的参数,而且都能得到想要的对象,比如HttpServletRequest或HttpServletRe ...

  9. HandlerMethodArgumentResolver 参数解析器

    关于springMvc中的参数解析器 springMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver(对参数的解析器) HandlerMet ...

随机推荐

  1. 解决logback不打印mybatis的SQL日志的问题

    工作这么多年,今天还是因为Logback的这个问题稍微卡了一下,惭愧. 问题描述: logback配置了如下信息: <appender name="sql" class=&q ...

  2. 腾讯云上面部署PHP运行环境

    现在云服务器已经很普及了,其价格.安全优势等成为不少开发者的首选.本人由于兴趣爱好,从朋友那边借了一个过来玩了两天,下面就分享整个部署流程吧. 1. 先到腾讯云官网购买服务器,这边就不演示.很简单,跟 ...

  3. mysql全局变量和局部变量

    全局变量和局部变量 在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值).然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用 ...

  4. open_basedir限制目录

    1.open_basedir介绍 前言:前些日我用lnmp一键安装包出现了open_basedir的问题,因为我把项目目录变了,所以要在的fastcgi.conf下面加上open_basedir的目录 ...

  5. 上下文管理器及with的相关总结

    什么是上下文管理器 基本语法 with EXPR as VAR: BLOCK 概念 上下文表达式:with open('test.txt') as f: 上下文管理器:open('test.txt') ...

  6. MIT线性代数:16.投影矩阵和最小二乘

  7. Android 常见内存泄露 & 解决方案

    前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃 (OOM) 等严重后果. 那什么情况下不能被 ...

  8. 题解【洛谷】CF134A

    题解 CF134A [Average Numbers] 这题就是简单的模拟. 只不过要优化一下常数什么的 思路: 为了不浪费时间总是取平均数,直接用一个 S 储存总和,每次都减去 a_i​ 再除以 n ...

  9. Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Web 版 VS Code、Azure 账号等

    北京时间 2019 年 11 月 4 日,在 Microsoft Ignite 2019 大会上,微软正式发布了 Visual Studio Online 公开预览版!发布之后,开发者们都为之振奋.同 ...

  10. DAY 3 数论专场

    2019-07-23 今天的题目一个比一个神仙,很早之前就在讨论今天是不是晚上回宾馆就没脑子了,后来发现,是中午.... 一上午就讲了一个PPT,然而标题就两个子---数论... 这谁顶的住....整 ...