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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值