Struts 2动作方法拦截使用Spring AOP

时间:2014-03-28 05:11:19

标签: spring struts2 aop spring-aop intercept

我试图拦截Struts2 Action类的方法,使用Spring AOP打印方法start和方法结束指示语句。

事实上,我的Struts2动作实例也是Spring bean(按照url:http://www.mkyong.com/struts2/struts-2-spring-integration-example/完成Struts2和Spring集成)。 AOP配置如下:

<bean id="testAdviceBean" class="com.tcs.oss.plugins.SimpleAdvice"> 
</bean>

<aop:config>
  <aop:aspect ref="testAdviceBean" order="200">

     <aop:pointcut id="testPoint2"
           expression="execution(java.lang.String com.test..DeviceAction.*(..))"
     /> 

     <aop:around pointcut-ref="testPoint2" method="loggingAdvice" />  

  </aop:aspect>
</aop:config>

在通知方法 loggingAdvice 中,我正在尝试使用ProceedingJoinPoint API打印方法START和方法END语句。根本不会调用通知方法...而是以最终结束通过struts默认拦截器链后的错误......

但是我得到了以下的错误追踪:

  

09:26:49,093 TRACE   [org.springframework.beans.factory.support.DefaultListableBeanFactory]   (http-01h3463916-172.20.211.235-8543-5)忽略构造函数[public   org.apache.struts2.dispatcher.ServletDispatcherResult(java.lang.String中)]   bean'org.apache.struts2.dispatcher.ServletDispatcherResult':   org.springframework.beans.factory.UnsatisfiedDependencyException:   使用名称创建bean时出错   'org.apache.struts2.dispatcher.ServletDispatcherResult':不满意   依赖性通过构造函数参数表示,索引为0   [java.lang.String] ::没有类型为[java.lang.String]的匹配bean   找到依赖:预计至少有1个bean符合条件   自动装配此依赖关系的候选者。依赖关系注释:{};   嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   为依赖项找到匹配的类型为[java.lang.String]的bean:   预计至少有1个豆有资格成为autowire候选人   这种依赖。依赖注释:{}

     

09:26:49,095 TRACE   [org.springframework.beans.factory.support.DefaultListableBeanFactory]   (http-01h3463916-172.20.211.235-8543-5)不自动装配属性   bean的'urlHelper'   'org.apache.struts2.dispatcher.ServletDispatcherResult'按名称:否   找到匹配的bean

     

09:26:49,100 DEBUG   [org.apache.struts2.dispatcher.ServletDispatcherResult]   (http-01h3463916-172.20.211.235-8543-5)转发到位置   /General/error.jsp

如果我只是删除上面的AOP配置,它只是工作正常。我做错了什么?

2 个答案:

答案 0 :(得分:0)

没有调用advice方法,因为Action类是从ActionSupport类扩展的,而ActionSupport又有一个接口实现......所以,在这种情况下,为Action类创建了一个JDK代理 - 这种类型的代理没有'对Action类有任何特定于方法的(非继承)。

在AOP配置中添加proxy-target-class =“true”属性使Spring生成CGLib(需要在Classpath中添加CGLib)基于代理...现在它也具有非继承方法, Action类。

答案 1 :(得分:0)

经过一番挖掘后,我想我发现了这个问题(如果你使用Spring来帮助AOP,即使你不是你可能需要一个不同的ObjectFactory),还有它的长短之处是你需要确保struts ObjectFactory设置正确:

<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true"/>

<constant name="struts.objectFactory" value="spring" />
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true"/>

来源:http://www.javawebdevelop.com/3294124/