切入点参数定义错误:发现是因为在 配置文件 中对进行要拦截的方法参数的注入。
也就是说,如果你要拦截的方法中有参数,那么在配置文件的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>