Spring Aopパラメータ名の取得方法


前言:
Spring Aopを断面に向けてプログラミングしている場合がありますが、接続点のパラメータ名、パラメータ値を取得する必要があります。
環境:
  • Mac OSX
  • Intellij IDEA
  • Spring Boot 2 x
  • Jdk 1.8 x
  • コード:
    
    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([email protected])
     */
    @Aspect
    @Component
    @Slf4j
    public class DemoAop {
     
        /**
         *     
         * @param proceedingJoinPoint
         * @return
         * @throws Throwable
         */
        @Around(value = "execution(* com.example.aopdemo..*(..)))")
        public Object demoAop(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            
            log.debug("   :");
            
            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();  //       ,object:     
            
            log.debug("   :");
            
            return object;
        }
        /**
         *     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;
        }
    }
    AOPカット面でパラメータを得るためのテクニック
    一般的に、私たちのパラメータはJsonを通じて伝達されます。この問題はJsonから指定された文字列を取得する問題になります。
    OKです。この問題は簡単です。
    以下のとおりです
    
    public static void main(String[] args) {
        //   JSONObject fastjson-1.2.41.jar   
        JSONObject jsonObject = JSON.parseObject("{\"timeStamp\":21602756894612,\"status\":0,\"results\":{\"userName\":\"yang20102\",\"userLevel\":\"3\"},\"errorCode\":null,\"errorMessage\":null}");
        //   json      
        Object timeStamp = jsonObject.get("timeStamp");
        System.out.println("timeStamp:" + timeStamp);
     
        //       
        Object results = jsonObject.get("results");
        JSONObject jsonObjectResults = JSON.parseObject(results.toString());
        Object userName = jsonObjectResults.get("userName");
        System.out.println("userName:" + userName);
    }
    実例Jsonは以下の通りです
    
    {
      "timeStamp": 21602756894612,
      "status": 0,
      "results": {
        "userName": "yang20102",
        "userLevel": "3"
      },
      "errorCode": null,
      "errorMessage": null
    }
    以上は個人の経験ですので、参考にしていただければと思います。