问题需求: 在执行系统中的某些方法后(如执行类名包含有Controller关键字的类中的方法后,再去执行打印某短信息的方法)。
解决办法<->:
一、在Spring的配置文件中配置名为BeanNameAutoProxyCreator的interceptor
<bean id="accessAdvisor" class="com.wsheng.uiservices.advisors.RestAPIAccessAdvisor" />
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*RestAPI</value> <value>*Controller</value> </list> </property> <property name="interceptorNames"> <list> <value>accessAdvisor</value> </list> </property> </bean>
二、创建类RestAPIAccessAdvisor并实现接口:AfterReturningAdvice
这样当调用完*Controller.java或者是*RestAPI.java这样的类中的方法后,将会执行其中的afterRutrning()方法,
public void afterReturning(Object returnValue, Method method,
Object[] params, Object target) throws Throwable {
try {
String methodName = method.getName();
// 在这里执行相应的逻辑
System.out.println(methodName);
} catch (Exception e) {
logger.error("Building Rest API Access Metrics Failure!!!", e);
}
}
解决办法<二>
一、同样在spring的配置文件中启动Spring的MVC配置。
<mvc:annotation-driven> <context:component-scan base-package="com.chuanliu.platform.activity"/>
二、配置相关的Interceptor类并制定interceptor的url
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/rest/relation/contacts/add/*"/> <bean class="com.chuanliu.platform.activity.basic.advisor.ActionAdvisor"/> </mvc:interceptor> </mvc:interceptors>
三、完成ActionAdvisor类
/**
*
*/
package com.chuanliu.platform.activity.basic.advisor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* @author Josh Wang(Sheng)
*
* @email josh_wang23@hotmail.com
*/
@Component("actionAdvisor")
public class ActionAdvisor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println(" ---- afterCompletion");
super.afterCompletion(request, response, handler, ex);
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
System.out.println(" --- afterCOncurrentHandlingStarted");
super.afterConcurrentHandlingStarted(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println(" --- postHandle");
System.out.println("=== " + request.getRequestURL());
System.out.println(" === " + response.getStatus());
super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
System.out.println(" --- preHandle");
System.out.println("--- " + request.getRequestURL());
return super.preHandle(request, response, handler);
}
}
执行测试会发现前拦截器中复写的方法都被执行了。