Springboot Controller接口默認(rèn)自動填充業(yè)務(wù)實(shí)體參數(shù)值詳解
前言
我還是一貫如此, 有人不明白,沒玩過HandlerMethodArgumentResolver 。
那么很可能不止他一個(gè)人, 那么我就有必要出手。
不多說,開搞。
快速模擬出這個(gè)使用場景

假如有好多接口,都需要用到 當(dāng)前的業(yè)務(wù)參數(shù), 這個(gè)業(yè)務(wù)場景需要的參數(shù) 是 當(dāng)前登錄人的信息。
常見的方案核心思路無非有二
① 后端寫個(gè)解析+查詢函數(shù),哪里需要就調(diào)用一下
② 后端提供一個(gè)獲取登錄人信息接口,前端先調(diào)用接口,緩存起來;然后哪些接口需要這個(gè)參數(shù),前端就從緩存拿出來然后傳過來。
第② 個(gè)方案,我直接pass。
- 需要前端配合,前端存拿存拿很麻煩,哪個(gè)接口需要還得跟前端溝通
- 前端的緩存什么時(shí)候需要更新?如果涉及改手機(jī)號或者一些參數(shù),但是token不失效,也就是業(yè)務(wù)標(biāo)識ID 不會變,那么前端的緩存數(shù)據(jù)就不是最新的
- xxxx 暫時(shí)不想太多
我的想法:
優(yōu)化第①個(gè)方案
做到 減少重復(fù)代碼的輸出,做到簡單使用、動態(tài)使用、自動填充。
也就是求救的小伙伴的想法思路,是的,自動填充,后端自己整。
事不宜遲,開敲。
需要做什么, 三件套(要玩花樣,玩動態(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;
}
}代碼簡析:
可以看到有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è)模擬的測試接口,玩一下,看看效果:
@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());
}測試:
先看看post接口:

debug,可以看到進(jìn)來了,而且能拿到注解雜七雜八的參數(shù):

最后數(shù)據(jù)填充成功:


然后試試get請求效果:

也是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動態(tài)代理的原理及實(shí)現(xiàn)
動態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類的代理對象。本文將通過案例詳細(xì)講解一下Java動態(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à)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活)
這篇文章主要介紹了IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
SpringBoot權(quán)限認(rèn)證Sa-Token的使用總結(jié)
Sa-Token是一款輕量級Java權(quán)限認(rèn)證框架,適用于快速搭建權(quán)限系統(tǒng),它提供了豐富的功能,包括登錄認(rèn)證、權(quán)限驗(yàn)證、角色驗(yàn)證、Session會話管理等,并且具有良好的社區(qū)支持和文檔資源,下面重點(diǎn)給大家介紹SpringBoot權(quán)限認(rèn)證Sa-Token的使用,感興趣的朋友一起看看吧2025-02-02
Java?Mybatis?foreach嵌套foreach?List<list<Object>&
在MyBatis的mapper.xml文件中,foreach元素常用于動態(tài)生成SQL查詢條件,此元素包括item(必選,元素別名)、index(可選,元素序號或鍵)、collection(必選,指定迭代對象)、open、separator、close(均為可選,用于定義SQL結(jié)構(gòu))2024-09-09

