我试图拦截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配置,它只是工作正常。我做错了什么?
答案 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"/>