1.需求场景

  • 在实际开发中,经常会遇到一下场景:
  1. controller 方法中拿到header中的userId,然后需要根据用户id去取到User的完整信息。在多个controller就会存在同样的重复代码--根据用户id取得user对象。
  2. 统一对请求json报文进行解密等操作。

类似这样的操作,可以通过自定义注解统一处理。

2.Talk is poor.

以场景1为基础,写一个demo。首先要给出环境:

  • Spring Boot 2.1.0.RELEASE.版本很重要1.x和2.x还是有区别的。
  1. 自定义注解

    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface CurrentUser {/*** 当前用户在request中的名字** @return*/String value() default "user";}
  2. 定义实体类
    public class UserBean implements Serializable {private String id;private String username;public UserBean(String id, String username) {this.id = id;this.username = username;}public UserBean() {}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
    }
  3. 定义注解解析类,其中HandlerMethodArgumentResolver是springframework提供的接口,实现即可
    public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {if (parameter.getParameterType().isAssignableFrom(UserBean.class) && parameter.hasParameterAnnotation(CurrentUser.class)) {return true;}return false;}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {CurrentUser currentUserAnnotation = parameter.getParameterAnnotation(CurrentUser.class);String userId = webRequest.getHeader("userId");//从数据库中根据用户id取用户信息,此处直接写死了。UserBean user = null;if("1001".equals(userId)){user = new UserBean(userId,"hendy");}if(user == null){throw new RuntimeException("用户不存在");}return user;}
    }
    
  4. 定义controller 方法,使用注解
    @RequestMapping(value = "/user/detail", method = RequestMethod.GET)@ResponseBodypublic Object test(@CurrentUser UserBean userBean) {String username = userBean.getUsername();System.out.println(username);return userBean;}

    网上有很多博客都是这样,到这一步就完成了。开始我也是按照网上那些来写,结果日常踩坑,比如:这篇,还有这篇,都没有把自定义的resolver接入到spring框架中,导致根本无效,还有一些是1.x版本的过时的配置方法。

  5. 关键的一步,addArgumentResolvers
    @Configuration
    public class WebAppConfig extends WebMvcConfigurationSupport {@Overrideprotected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(new CurrentUserMethodArgumentResolver());}
    }
  6. Test

把自己踩的坑记录一下,demo给出的也未必是实际的应用需求,学习交流,仅此。有问题欢迎留言。

SpringBoot 控制器方法自定义参数注入相关推荐

  1. SpringMVC控制器方法获取参数时@RequestParam注解加与不加的区别

    问题 在使用SpringMVC时获取参数时,加与不加@RequestParam都会自动传入参数值,那加与不加的区别是什么? 测试 @GetMapping("test1")publi ...

  2. springboot 在配置文件写参数注入到类中

    @Configuration//配置文件位置@PropertySource("classpath:city.properties")//前缀@ConfigurationProper ...

  3. SpringBoot 2.x yml 文件中自定义参数解析对象

    在SpringBoot中通过自定义参数可以实现很多重要的功能来达到解耦. SpringBoot 自定义参数的类型有: 简单键值对,自定义对象,数组,List,Map,List<Map> 1 ...

  4. SpringMVC 中控制器方法的可用参数类型和返回类型

    SpringMVC 中控制器方法的参数列表可接受以下类型的参数, 并当该方法被调用时, SpringMVC 框架可使得方法能够获得正确的参数: javax.servlet.ServletRequest ...

  5. Java框架-SpringMVC的应用(json数据交互、控制器方法返回值、文件上传)

    1. 搭建SpringMVC开发环境 1.1 创建项目,添加依赖 <?xml version="1.0" encoding="UTF-8"?> &l ...

  6. java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数

    在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数. 我只是使用@RequestParameter("name"). 但是我可以对request属性做同样的事情吗? ...

  7. SpringBoot - 优雅的实现【自定义参数校验】高级进阶

    文章目录 Pre 概述 三部曲 Step1 搞自定义注解 Step2 搞校验逻辑 Step3 使用 Step4 验证 附 int 类型的判断 源码 Pre SpringBoot - 优雅的实现[参数校 ...

  8. SpringBoot自定义参数

    1.在application.properties文件中自定义函数 2.在Controller中自定义函数: @Value("${name}")private String nam ...

  9. e0312 不存在用户定义的_更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

最新文章

  1. 【UGV】小车一些图片 麦轮版小车
  2. 斯坦福大学机器学习第八课“神经网络的表示(Neural Networks: Representation)”
  3. flutter开发之必须掌握的dart知识点:list,set,map
  4. Activiti工作流之事件监听详解-ActivitiEventListener
  5. Linux系统常用命令备忘
  6. python基础元组和列表区别(六)
  7. RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势...
  8. poj 2955 Brackets 区间DP
  9. 操作系统随机密码,定时改密码
  10. 用姿态补偿雷达数据畸变的文字想法
  11. 多元梯度下降法演练(1)--特征缩放(特征归一化),Feature Scaling,mean normalization machine learning
  12. 基于Proteus的51单片机超声波测距
  13. CAN报错BUSLIGHT,BUSHEVAY,BUSOFF什么意思
  14. JS 模拟鼠标自动点击【浏览器内】
  15. 警惕食源性疾病——食源性病原菌介绍
  16. 超链接一般有两种表现形式_超级链接有哪些常见的表现形式?
  17. 异常测试之Socket网络异常
  18. gtx660 linux驱动下载,佳能 GeForce GTX 660 驱动程序下载-更新佳能软件(显卡)
  19. 面试专题:QTrade(苹果树)面试复盘
  20. android代码控制组件的移动,Android自定义控件实现随手指移动的小球

热门文章

  1. 神犇营-49-人口增长问题
  2. 【报告分享】2020上半年市场薪酬白皮书-薪智(附下载)
  3. [Win32] 直接读写磁盘扇区(磁盘绝对读写)
  4. java二级考试备考_计算机二级java如何备考 方法在这里
  5. 第019讲:函数:我的地盘听我的
  6. java组合_Java组合
  7. 思维题-牛客网-强迫症的序列
  8. pwrkey直接接地 sim7020_玩转 ESP32 + Arduino (十九) SIM800L调试(基于TTGO T-CALL)
  9. 美国计算机硕士有预科吗,美国留学生过来人小陈谈美国硕士预科
  10. 用python怎么做数据统计-新闻联播也可以拿用Python来做数据分析?