Springboot Controller接口默認(rèn)自動(dòng)填充業(yè)務(wù)實(shí)體參數(shù)值詳解
前言
我還是一貫如此, 有人不明白,沒玩過HandlerMethodArgumentResolver 。
那么很可能不止他一個(gè)人, 那么我就有必要出手。
不多說,開搞。
快速模擬出這個(gè)使用場(chǎng)景
假如有好多接口,都需要用到 當(dāng)前的業(yè)務(wù)參數(shù), 這個(gè)業(yè)務(wù)場(chǎng)景需要的參數(shù) 是 當(dāng)前登錄人的信息。
常見的方案核心思路無非有二
① 后端寫個(gè)解析+查詢函數(shù),哪里需要就調(diào)用一下
② 后端提供一個(gè)獲取登錄人信息接口,前端先調(diào)用接口,緩存起來;然后哪些接口需要這個(gè)參數(shù),前端就從緩存拿出來然后傳過來。
第② 個(gè)方案,我直接pass。
- 需要前端配合,前端存拿存拿很麻煩,哪個(gè)接口需要還得跟前端溝通
- 前端的緩存什么時(shí)候需要更新?如果涉及改手機(jī)號(hào)或者一些參數(shù),但是token不失效,也就是業(yè)務(wù)標(biāo)識(shí)ID 不會(huì)變,那么前端的緩存數(shù)據(jù)就不是最新的
- xxxx 暫時(shí)不想太多
我的想法:
優(yōu)化第①個(gè)方案
做到 減少重復(fù)代碼的輸出,做到簡(jiǎn)單使用、動(dòng)態(tài)使用、自動(dòng)填充。
也就是求救的小伙伴的想法思路,是的,自動(dòng)填充,后端自己整。
事不宜遲,開敲。
需要做什么, 三件套(要玩花樣,玩動(dòng)態(tài),少不了自定義注解+aop):
首先是來個(gè)自定義注解,用于標(biāo)記,哪些接口需要用到我們默認(rèn)填充業(yè)務(wù)參數(shù):
①LoginUserX.java
import java.lang.annotation.*; /** * @Author: JCccc * @Date: 2022-4-11 18:45 * @Description: */ @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LoginUserX { }
② 自定義一個(gè)參數(shù)解析器 HandlerMethodArgumentResolver
LoginUserParamResolver.java
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 java.util.Objects; /** * @Author: JCccc * @Date: 2022-4-11 18:45 * @Description: */ public class LoginUserParamResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { if (parameter.getParameterType().isAssignableFrom(LoginUserAnalysis.class) && parameter.hasParameterAnnotation(LoginUserX.class)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { if (Objects.nonNull(parameter.getParameterAnnotation(LoginUserX.class))){ String token = webRequest.getHeader("token"); //解析token 、獲取 登錄用戶信息等等,或者是 拿你需要的業(yè)務(wù)參數(shù) return new LoginUserAnalysis().setLoginNameAnalysis("JCcccc").setPhoneAnalysis("136919xxxxx").setTopRoleTypeAnalysis(1); } return null; } }
代碼簡(jiǎn)析:
可以看到有2個(gè)函數(shù)
supportsParameter
:看看誰支持誰不支持resolveArgument
:開始解析,寫邏輯代碼
③ 默認(rèn)填充的業(yè)務(wù)實(shí)體示例 LoginUserAnalysis.java
import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) public class LoginUserAnalysis { private String loginNameAnalysis; private String phoneAnalysis; private Integer topRoleTypeAnalysis; }
最后寫2個(gè)模擬的測(cè)試接口,玩一下,看看效果:
@GetMapping("doGetTest") public String doGetTest(@LoginUserX LoginUserAnalysis loginUserAnalysis,String queryName){ System.out.println("接收到的參數(shù):"+queryName); System.out.println("默認(rèn)填充的參數(shù)"+loginUserAnalysis.toString()); return "ok"; } @PostMapping("doPostTest") public void doPostTest(@LoginUserX LoginUserAnalysis loginUserAnalysis, @RequestBody Car car){ System.out.println("接收到的參數(shù):"+car.toString()); System.out.println("默認(rèn)填充的參數(shù)"+loginUserAnalysis.toString()); }
測(cè)試:
先看看post接口:
debug,可以看到進(jìn)來了,而且能拿到注解雜七雜八的參數(shù):
最后數(shù)據(jù)填充成功:
然后試試get請(qǐng)求效果:
也是OK的:
好了該篇就到這,想要默認(rèn)填充哪些業(yè)務(wù)參數(shù),自己開整吧。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot之@Controller和@RequestMapping的實(shí)現(xiàn)原理解讀
- SpringBoot和MybatisPlus實(shí)現(xiàn)通用Controller示例
- SpringBoot如何實(shí)現(xiàn)調(diào)用controller和Service層方法
- springboot中的controller參數(shù)映射問題小結(jié)
- springboot中Controller內(nèi)文件上傳到本地及阿里云操作方法
- springboot的統(tǒng)一異常處理,使用@RestControllerAdvice詳解
- springboot如何通過controller層實(shí)現(xiàn)頁面切換
相關(guān)文章
Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
這篇文章主要介紹了Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Cloud,感興趣的朋友可以了解下2021-03-03一文了解Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn)
動(dòng)態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對(duì)象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類的代理對(duì)象。本文將通過案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下2022-07-07導(dǎo)入maven項(xiàng)目各個(gè)注解均報(bào)錯(cuò)的解決方案
這篇文章主要介紹了導(dǎo)入maven項(xiàng)目各個(gè)注解均報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12詳解Java中的數(shù)組與字符串相關(guān)知識(shí)
這篇文章主要介紹了詳解Java中的數(shù)組與字符串相關(guān)知識(shí),包括操作字符串的一些基本方法列舉,需要的朋友可以參考下2015-09-09IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活)
這篇文章主要介紹了IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02SpringBoot權(quán)限認(rèn)證Sa-Token的使用總結(jié)
Sa-Token是一款輕量級(jí)Java權(quán)限認(rèn)證框架,適用于快速搭建權(quán)限系統(tǒng),它提供了豐富的功能,包括登錄認(rèn)證、權(quán)限驗(yàn)證、角色驗(yàn)證、Session會(huì)話管理等,并且具有良好的社區(qū)支持和文檔資源,下面重點(diǎn)給大家介紹SpringBoot權(quán)限認(rèn)證Sa-Token的使用,感興趣的朋友一起看看吧2025-02-02Java?Mybatis?foreach嵌套foreach?List<list<Object>&
在MyBatis的mapper.xml文件中,foreach元素常用于動(dòng)態(tài)生成SQL查詢條件,此元素包括item(必選,元素別名)、index(可選,元素序號(hào)或鍵)、collection(必選,指定迭代對(duì)象)、open、separator、close(均為可選,用于定義SQL結(jié)構(gòu))2024-09-09