BeanNameAutoProxyCreator拦截器拦截某个实现类方法的步骤
第一步:配置实现MethodInterceptor的切面
- public class OutsideInvokeLogInterceptor implements MethodInterceptor{
- private static Logger log = Logger.getLogger("outsideInvoke");
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- String methodName = invocation.getMethod().toString();
- Object returnValue = invocation.proceed();
- if (returnValue == null) {
- log.warn("调用 " + methodName + "is fail,返回的result结果为空,方法入参为:(" + parseArguments(invocation.getArguments()) + ")");
- return ResultDTO.getFailureResult(BSErrorCode.INTERNAL_ERROR, BaseKeyMsgCode.RETURN_RESULTDTO_IS_NULL);
- }else{
- if(returnValue instanceof ResultDTO){
- ResultDTO<Object> resultDTO = (ResultDTO<Object>)returnValue;
- if(!resultDTO.isSuccess()){
- log.warn("调用 " + methodName + " is fail ,方法入参为:(" + parseArguments(invocation.getArguments()) + ")"
- + "返回值:" +resultDTO.getCode() + "," + resultDTO.getKey());
- } else{
- log.info("调用 " + methodName + " is success ,方法入参为:(" + parseArguments(invocation.getArguments()) + ")");
- }
- }
- }
- return returnValue;
- }
- }
- <bean id="outsideInvokeLogAdvice" class="com.ali.luna.commons.service.interceptor.OutsideInvokeLogInterceptor" />
第二步:配置切点
- <bean id="methodPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
- <property name="mappedNames">
- <list>
- <value>add*</value>
- </list>
- </property>
- </bean>
第三步:配置自动代理
- <bean id="outsideInvokeLogInterceptor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
- <property name="pointcut" ref="methodPointcut"/>
- <property name="advice" ref="outsideInvokeLogAdvice"/>
- </bean>
- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <list><value>activityService</value></list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>outsideInvokeLogInterceptor</value>
- </list>
- </property>
- </bean>
BeanNameAutoProxyCreator拦截某一系列类的所有方法
配置文件内容:
<!-- 配置EDI异常捕获切入 -->
<bean id="exceptionHandler" class="com.sinosure.sol.service.edi.monitor.EdiExceptionHandler" >
<property name="ediMonitorMailService" ref="ediMonitorMailService" />
</bean>
<bean id="proxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>ediDomQuotaApplyService,ediNoLcQuotaApplyService,ediContractApplyInfoService</value>
</property>
<property name="interceptorNames">
<list>
<value>exceptionHandler</value>
</list>
</property>
</bean>
拦截处理类EdiExceptionHandler:
public class EdiExceptionHandler implements ThrowsAdvice {
private EdiMonitorMailService ediMonitorMailService;
public EdiMonitorMailService getEdiMonitorMailService() {
return ediMonitorMailService;
}
public void setEdiMonitorMailService(EdiMonitorMailService ediMonitorMailService) {
this.ediMonitorMailService = ediMonitorMailService;
}
public void afterThrowing(Method method, Object[] args, Object target, Throwable throwable) throws Throwable{
StringBuffer str = new StringBuffer();
str.append("发生异常的方法名称: " + method.getName()+";");
str.append("发生异常的代理对象: " + target.toString()+";");
for(int i=0;i<args.length;i++){
if(args[i].getClass().getSimpleName().equals("HashMap")){
HashMap map = (HashMap)args[i];
str.append("发生异常的交易ID为:" + map.get("editimer_exceptionDataid")+";");
str.append("发生异常的交易客户clientno为:" + map.get("editimer_exceptionClientid")+";");
str.append("发生异常的交易客户rclientno为:" + map.get("editimer_exceptionRClientid")+";");
}
}
Exception ex = new Exception(throwable);
str.append("发生的异常描述: " + ex.getCause()+";");
str.append("异常的详细信息: " +";");
for(StackTraceElement se : throwable.getStackTrace()){
str.append(se.toString() +";");
}
ediMonitorMailService.sendMailPlainContent("EDI Timer Exception", str.toString());
}
}