HandlerMethodArgumentResolver 是SpringBoot 中的一个接口,也是Spring 面向切面的编程的一种提现,这个接口我们从名称上大概能了解其中的意思:操作方法参数解析  ,换句话的意思就是说解析接口的参数方法,那么什么时候解析,自然是在调用函数之前解析,那些方法需要解析,自然是需要指定方法解析

比如我们写一个实现类:

package com.abs.system.filter;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;import com.abs.system.util.Params;public class AbsHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {private Logger logger=LoggerFactory.getLogger(AbsHandlerMethodArgumentResolver.class);@Overridepublic boolean supportsParameter(MethodParameter parameter) {logger.info("正在调用执行:{}",parameter.getMember().getName());return parameter.hasParameterAnnotation(ToParams.class);}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {logger.info("对用户请求进行解析");HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);String token = request.getHeader("Authorization");ServletContext en = request.getServletContext();Params params = new Params();params.put("token", token);return params;}}

在这个实现类中要执行两个方法是,一个是 1. 判断那些方法需要解析 2.如何解析

那么我们可以给接口增加一些注释,比如创建注释:

package com.abs.system.filter;import java.lang.annotation.Documented;
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)
@Documented
public @interface ToParams {}

现在我需要解析的是,方法中包含@ToParams 注释的都进行解析,下面这个接口中正好包含这个注释,那么也就是我们在调用istokevalid 这个接口的之前,会执行自动解析函数的方法,或者说会执行上面我们自定义的实现类,对接口参数进行解析和封装

 @ResponseBody@RequestMapping("/istokenvalid")public JSONObject isTokenValid(@ToParams Params params){String token=params.getString("token");logger.info("当前用户token:{}",token);String userguid=AbsSessionHelper.getCurrentUserGuid(token);if(StrUtil.isNotBlank(userguid)) {return BuildJsonOfObject.getJsonString(MSG.ok, MSG.SUCCESSCODE);}return BuildJsonOfObject.getJsonString(MSG.TokenIsValid, MSG.FAILCODE);}

我们自定义的实现类一定会执行吗,肯定不是的,我们需要将其注册到拦截器中:

package com.abs.system.filter;import java.util.List;import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class AbsWebMvcConfigurerAdapter extends WebMvcConfigurationSupport {.........@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {super.addArgumentResolvers(argumentResolvers);argumentResolvers.add(new AbsHandlerMethodArgumentResolver());}.........
}

这样当我们调用接口的时候,如果包含@ToParams 就会执行自动解析参数类

希望对你有所帮助

SpringBoot 自动解析参数:HandlerMethodArgumentResolver相关推荐

  1. SpringBoot是如何解析参数的

    前言 前几天笔者在写Rest接口的时候,看到了一种传值方式是以前没有写过的,就萌生了一探究竟的想法.在此之前,有篇文章曾涉及到这个话题,但那篇文章着重于处理流程的分析,并未深入. 本文重点来看几种传参 ...

  2. #{}不自动改参数类型_Spring参数的自解析还在自己转换?你out了!

    背景前段时间开发一个接口,因为调用我接口的同事脾气特别好,我也就不客气,我就直接把源代码发给他当接口定义了. 没想到同事看到我的代码问:要么 get  a,b,c  要么  post [a,b,c]. ...

  3. 拦截器HandlerInterceptor+方法参数解析器HandlerMethodArgumentResolver用于统一获取当前登录用户信息

    文章目录 前言 一.拦截器+方法参数解析器 是什么? 二.具体实现步骤 1.自定义权限拦截器LoginInterceptor拦截所有request请求,并将token解析为currentUser,最终 ...

  4. springboot 自动装配_Java互联网架构-SpringBoot自动装配核心源码剖析

    欢迎关注头条号:java小马哥 周一至周日早九点半!下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 用了差不多两年的SpringBoot了,可以说对SpringBoot已经很熟 ...

  5. SpringBoot实战之SpringBoot自动配置原理

    www.cnblogs.com/leihuazhe/p- SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConf ...

  6. springboot自动配置的原理_SpringBoot自动配置原理

    SpringBoot的启动入口就是一个非常简单的run方法,这个run方法会加载一个应用所需要的所有资源和配置,最后启动应用. 通过查看run方法的源码,我们发现,run方法首先启动了一个监听器,然后 ...

  7. springboot自动配置的原理_SpringBoot实战:详解SpringBoot自动配置原理

    SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...

  8. Springboot视图解析与模板引擎

    1.视图解析 视图解析:SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染. 视图解析原理流程 1.目标方法处理的过程中,所有数据都会被放在 ModelAndViewCon ...

  9. 面试题总结(mybatis一级缓存及二级缓存、springboot自动装配原理等)

    1.mybatis一级缓存及二级缓存 区别: 一级缓存的作用域是一个sqlsession内: 二级缓存作用域是针对mapper(Namespace)进行缓存: 一级缓存: 在参数和SQL完全一样的情况 ...

最新文章

  1. ggplot2设置坐标轴范围_ggplot2画图时出现重合的点以及标签如何处理?有现成的包ggrepel
  2. IO多路复用之select篇
  3. python正则表达式面试_【剑指offer】面试题19. 正则表达式匹配
  4. mysql扩展使用_mysql的扩展应用
  5. hdu 5833 Zhu and 772002 (高斯消元)
  6. jsp mysql电子档案管理系统_学生档案管理系统的设计与实现(JSP,MySQL)(含录像)
  7. 专访图灵奖得主David Patterson:8年前就得知被提名,AI跃迁看好边缘计算
  8. 9. Document getElementsByName() 方法
  9. 什么是网站死链?如何查询网站死链?网站死链怎么解决?
  10. studio 和mac快捷键
  11. 自动修改hosts文件
  12. 国产服务器飞腾/鲲鹏/龙芯下Linux(统信UOS、麒麟系统)下GB28181/Onvif/RTSP监控视频平台的部署操作
  13. 解决·web项目在浏览器页面上乱码
  14. unique中译_UNIQUE是什么意思_ UNIQUE的翻译_音标_读音_用法_例句_爱词霸在线词典...
  15. 程序员英语 - Word Group
  16. CSS---按住录音提示框制作
  17. 《利用Python进行数据分析·第2版》第14章 数据分析案例
  18. IDEA安装插件 之 使用本地下载的jar包安装
  19. 常用计算机故障处理指令,计算机常见故障分析与维修.ppt
  20. android各版本对比[取之网络,用之网络]

热门文章

  1. Keypress - 捕获键盘输入的JavaScript库
  2. 联机分析处理(OLAP)简介
  3. Access快速连接SQL Server的方法(VB代码为例)
  4. “伪高管”是如何搞垮一个公司的?
  5. 架构篇:Tomcat 高层组件构建一个商业帝国
  6. 阿里巴巴Druid,轻松实现MySQL数据库加密!
  7. 360展示广告智能化演进
  8. 用它调试线上 bug,真得劲 | webconsole
  9. 为什么阿里不允许用Executors创建线程池
  10. MapReduce设计模式