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

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

首先是來個自定義注解,用于標記,哪些接口需要用到我們默認填充業(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 {
}② 自定義一個參數(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個函數(shù)
supportsParameter:看看誰支持誰不支持resolveArgument:開始解析,寫邏輯代碼

③ 默認填充的業(yè)務(wù)實體示例 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個模擬的測試接口,玩一下,看看效果:
@GetMapping("doGetTest")
public String doGetTest(@LoginUserX LoginUserAnalysis loginUserAnalysis,String queryName){
System.out.println("接收到的參數(shù):"+queryName);
System.out.println("默認填充的參數(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("默認填充的參數(shù)"+loginUserAnalysis.toString());
}測試:
先看看post接口:

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

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


然后試試get請求效果:

也是OK的:

好了該篇就到這,想要默認填充哪些業(yè)務(wù)參數(shù),自己開整吧。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringBoot之@Controller和@RequestMapping的實現(xiàn)原理解讀
- SpringBoot和MybatisPlus實現(xiàn)通用Controller示例
- SpringBoot如何實現(xiàn)調(diào)用controller和Service層方法
- springboot中的controller參數(shù)映射問題小結(jié)
- springboot中Controller內(nèi)文件上傳到本地及阿里云操作方法
- springboot的統(tǒng)一異常處理,使用@RestControllerAdvice詳解
- springboot如何通過controller層實現(xiàn)頁面切換
相關(guān)文章
Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
這篇文章主要介紹了Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Cloud,感興趣的朋友可以了解下2021-03-03
IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活)
這篇文章主要介紹了IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
SpringBoot權(quán)限認證Sa-Token的使用總結(jié)
Sa-Token是一款輕量級Java權(quán)限認證框架,適用于快速搭建權(quán)限系統(tǒng),它提供了豐富的功能,包括登錄認證、權(quán)限驗證、角色驗證、Session會話管理等,并且具有良好的社區(qū)支持和文檔資源,下面重點給大家介紹SpringBoot權(quá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

