1. 程式人生 > >AOP異常一:Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut

AOP異常一:Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut

切入點引數定義錯誤:發現是因為在 配置檔案 中對進行要攔截的方法引數的注入

也就是說,如果你要攔截的方法中有引數,那麼在配置檔案的aspect的expression中也需要有 and args(methodName)

舉我編寫的例子:

package com.zrkj.interceptor;


import com.alibaba.fastjson.JSONObject;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//把普通pojo例項化到spring容器中,相當於配置檔案中的<bean id="" class=""/>
@Component
public  class LogInterceptor {

    private static final Logger logger = LogManager.getLogger(LogInterceptor.class);

    public Object  around(ProceedingJoinPoint proceedingJoinPoint,
                          HttpServletRequest request,HttpServletResponse response) throws Throwable{

        String methodName = proceedingJoinPoint.getSignature().getName();
        String entity = proceedingJoinPoint.getTarget().getClass().getName();
        JSONObject result =new JSONObject();
        try {
            result = (JSONObject) proceedingJoinPoint.proceed();//test方法的返回值
        } catch (Exception ex) {
            //test方法若有異常,則進行處理寫入日誌
            result.put("success", false);
            result.put("desc", "exception");

            //獲取請求的URL
            StringBuffer requestURL = request.getRequestURL();
            //獲取參 數資訊
            String queryString = request.getQueryString();
            //封裝完整請求URL帶引數
            if(queryString != null){
                requestURL .append("?").append(queryString);
            }

            String errorMsg = "";
            StackTraceElement[] trace = ex.getStackTrace();
            for (StackTraceElement s : trace) {
                errorMsg += "\tat " + s + "\r\n";
            }

            StringBuffer sb=new StringBuffer();
            sb.append("exception!!!\r\n");
            sb.append("   請求URL:"+requestURL+"\r\n");
            sb.append("   介面方法:"+entity+"."+methodName+"\r\n");
            sb.append("   詳細錯誤資訊:"+ex+"\r\n");
            sb.append(errorMsg+"\r\n");
            logger.error(sb.toString());
        }
        if(result!=null && !result.isEmpty()){
            response.getWriter().print(result.toString());
        }
        return null;
    }

}

因為我使用的是SSM框架,所以AOP的配置檔案我寫在了spring-mvc.xml中:

<!-- 使用xml配置aop -->
<!-- 強制使用cglib代理,如果不設定,將預設使用jdk的代理,但是jdk的代理是基於介面的 -->
<aop:config proxy-target-class="true" />
<aop:config>
    <!--定義切面-->
    <aop:aspect id="logAspect" ref="logInterceptor">
        <!-- 
            and args(request,response) :攔截方法中的引數,個數和循序都要一致
            或者:and args(..):不論方法有多少個引數,都可以被這個切點切入了
        -->
        <aop:pointcut expression="execution(* com.zrkj.controller.*.*(..)) and args(request,response)"  id="logPointCut"/>
        <aop:around method="around" pointcut-ref="logPointCut"/>
    </aop:aspect>
</aop:config>