当前位置: 首页 > news >正文

springboot自定义参数解析器

为什么要自定义参数解析器呢?

因为很多项目每次获取用户信息,需要重复从请求头中获取token,用token再去redis或是sql中去拿到存储的计本对象,再将获取到的Json数据,转化为我们需要的对象等代码,作为一名程序员面对如此重复的代码实在是不能容忍

当然很多人会说那我将这些步骤封装成一个方法,想要获取的时候调一下不就好了吗。当然这是一个解决办法,但是你依旧需要去在代码中去写对应的方法。
于是我就在想是否可以在接受请求参数的时候就将这些步骤全部执行完毕,Controller接受的时候就已经是一个用户信息的实体类了。
之后我就开始找方法,还真就被我找到了HandlerMethodArgumentResolver.class,中文称为方法参数解析器,是Spring Web(SpringMVC)组件中的众多解析器之一,主要用来对Controller中方法的参数进行处理。
自定义一个方法参数解析器主要去实现HandlerMethodArgumentResolver.class中的两个方法:supportsParameter方法、resolveArgument方法

  • supportsParameter 方法

    • 当该方法返回false时,跳过;
    • 当该方法返回true时,进入resolveArgument方法;
  • resolveArgument 方法

    • 用于编写request解析逻辑

具体代码

@Component
public class UserInfoArgumentResolver implements HandlerMethodArgumentResolver {@Autowiredprivate RedisService redisService;@Overridepublic boolean supportsParameter(MethodParameter parameter) {// 判断方法参数是否与指定类型对象一致,是则返回true,否则返回false//如果Controller的接收参数为User类型 返回truereturn parameter.getParameterType() == User.class;}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest();String token = request.getHeader("token");//通过token去redis中获取数据String userStr = redisService.getCacheObject(token);UserInfo userInfo = JSON.parseObject(userStr, UserInfo.class);User user = JSONUtil.toBean(request.getParameter("user"), User.class);return user;}}

将自定义解析器添加到解析器列表中

@Configuration
public class WebConfiguration implements WebMvcConfigurer {@Autowiredprivate UserInfoArgumentResolver userInfoArgumentResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(userInfoArgumentResolver);}
}

Controller

    @RequestMapping("/test")public User test(User user){return user;}

不过这个方法有个问题就是多个参数就会报参数类型的错误,我还没找到方法,也希望大家可以试一试

http://www.lryc.cn/news/19884.html

相关文章:

  • Python Unittest ddt数据驱动
  • Vue自定义组件遇到分页传输数据不正确解决办法
  • ABAP 辨析CO|CN|CA|NA|CS|NS|CP|NP
  • RK3568平台开发系列讲解(设备驱动篇)Pinctrl子系统详解
  • ROS小车研究笔记:二维SLAM建图简介与源码分析
  • 番外9:使用ADS对射频功率放大器进行非线性测试1(以IMD3测试为例)
  • 车载软件背景(留坑)
  • Hadoop-MapReduce
  • ChatGPT来了,软件测试工程师距离失业还远吗?
  • 【项目实战】Linux服务管理 之 开启/关闭防火墙
  • OSS存储使用之centOS系统ossfs挂载
  • 【项目实战】SpringBoot多环境(dev、test、prod)配置
  • Laravel框架01:composer和Laravel简介
  • 【bug】Transformer输出张量的值全部相同?!
  • 【LeetCode】剑指 Offer(8)
  • 安装MySQL数据库
  • 手写Android性能监测工具,支持Fps/流量/内存/启动等
  • Java知识复习(三)Java IO
  • Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
  • 2023年全国最新会计专业技术资格精选真题及答案5
  • 软工个人作业 -- 分析与提问
  • C++类和对象到底是什么意思?
  • 【电路设计】常见电路及相关解释
  • 【一天一门编程语言】Linux 实用命令大全
  • 【汇编】二、预备知识(一只 Assember 的成长史)
  • Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?
  • ZZNUOJ_用C语言编写程序实现1193:单科成绩排序(结构体专题)(附完整源码)
  • expect 使用方法
  • Spring AOP详解-Spring官方原版
  • 链表习题精选(持续更新中)