AOP異常一:Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
阿新 • • 發佈:2019-02-14
切入點引數定義錯誤:發現是因為在 配置檔案 中對進行要攔截的方法引數的注入。
也就是說,如果你要攔截的方法中有引數,那麼在配置檔案的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>