SpringAOP如何修改請求參數(shù)列表
SpringAOP修改請求參數(shù)列表
如題,今天遇到了一個問題,要批量在前端請求之后修改其中的一個參數(shù)值。
我使用SpringAop攔截請求去修改參數(shù)值,因為Spring Aop是無法直接根據(jù)參數(shù)名獲取參數(shù)的,所以使用MethodSignature首先獲取當前方法的參數(shù)列表,找到對應參數(shù)的下標,然后根據(jù)下標獲取當前參數(shù)對應的值。
代碼如下:
private final String execution = "execution(* com.zxy.test.degitaltool.tree.controller.TestController.*(..))"; /** * @param pjp * @return * @throws Throwable */ @Around(execution) public Object before(ProceedingJoinPoint pjp) throws Throwable { Method method = ((MethodSignature) pjp.getSignature()).getMethod(); Parameter[] parameters = method.getParameters(); int keyIndex = getKeyIndex2(parameters, "treeId"); Object[] args = pjp.getArgs(); if (keyIndex != -1) { String value = args[keyIndex];//找到對應的值 ... } return pjp.proceed(args);//修改參數(shù)值 } private int getKeyIndex2(Parameter[] parameters, String key) { for (int i = 0; i < parameters.length; i++) { if (Objects.equals(parameters[i].getName(), key)) { return i; } } return -1; }
SpringAOP獲取參數(shù)名參數(shù)值
有時候我們在用Spring Aop面向切面編程,需要獲取連接點(JoinPoint)方法參數(shù)名、參數(shù)值。
環(huán)境:
- Mac OSX
- Intellij IDEA
- Spring Boot 2x
- Jdk 1.8x
Code:
package com.example.aopdemo.aop; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.CodeSignature; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * DemoAop * Create by Gray(Ganguocai@outlook.com) */ @Aspect @Component @Slf4j public class DemoAop { /** * 環(huán)繞通知 * @param proceedingJoinPoint * @return * @throws Throwable */ @Around(value = "execution(* com.example.aopdemo..*(..)))") public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { log.debug("執(zhí)行前:"); Map<String, Object> params = getNameAndValue(proceedingJoinPoint); for (Map.Entry<String, Object> entry : params.entrySet()) { System.out.println("name: " + entry.getKey() + " value: " + entry.getValue()); } Object object = proceedingJoinPoint.proceed(); //執(zhí)行連接點方法,object:方法返回值 log.debug("執(zhí)行后:"); return object; } /** * 獲取參數(shù)Map集合 * @param joinPoint * @return */ Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) { Map<String, Object> param = new HashMap<>(); Object[] paramValues = joinPoint.getArgs(); String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames(); for (int i = 0; i < paramNames.length; i++) { param.put(paramNames[i], paramValues[i]); } return param; } }
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java使用Callable接口實現(xiàn)多線程的實例代碼
這篇文章主要介紹了Java使用Callable接口實現(xiàn)多線程的實例代碼,實現(xiàn)Callable和實現(xiàn)Runnable類似,但是功能更強大,具體表現(xiàn)在可以在任務結束后提供一個返回值,Runnable不行,call方法可以拋出異,Runnable的run方法不行,需要的朋友可以參考下2023-08-08springboot多模塊項目mvn打包遇到存在依賴但卻無法發(fā)現(xiàn)符號問題
在SpringBoot多模塊項目中,如果遇到依賴存在但無法發(fā)現(xiàn)符號的問題,常見原因可能是pom.xml配置問題,例如,如果某個模塊僅作為依賴而不是啟動工程,不應在其pom中配置spring-boot-maven-plugin插件,因為這將影響jar包的生成方式2024-09-09從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率
這篇文章主要介紹了從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12