spring整合struts使用AOP拦截action不成功,如何解决?
想用aop做用户验证,代码如下:
ClassAction:
package action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import aop.Interface.StrutsAction;
import service.ClassManage;
import vo.Class;
public class ClassManageAction extends Action{
private ClassManage classManage;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
……
}
public void setClassManage(ClassManage classManage) {
this.classManage = classManage;
}
}
struts-config.xml:
<struts-config>
<data-sources />
<form-beans>
<form-bean name="class" type="vo.Class"/>
</form-beans>
<global-exceptions />
<global-forwards > </global-forwards>
<action-mappings >
<action path="/classManage" type="org.springframework.web.struts.DelegatingActionProxy"
name="class">
<forward name="" path=""></forward>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
拦截器:
package aop.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import service.AuthorityService;
public class AuthorityCheckAroundAdvice implements MethodInterceptor{
private AuthorityService authorityService;
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(invocation.getMethod().getDeclaringClass());
invocation.proceed();
return null;
}
public void setAuthorityService(AuthorityService authorityService) {
this.authorityService = authorityService;
}
}
spring配置文件:applicationContext.xml
<beans>
<bean id="classManage" class="service.impl.ClassManageImpl">
<property name="classDAO">
<ref local="classDAO" />
</property>
</bean>
<bean name="/classManage" class="action.ClassManageAction">
<property name="classManage">
<ref local="classManage" />
</property>
</bean>
<bean id="advice" class="aop.advice.AuthorityCheckAroundAdvice">
<property name="authorityService">
<ref local="authorityService"/>
</property>
</bean>
<bean id="aopAuthorityCheck" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/classManage</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>advice</value>
</list>
</property>
</bean>
<bean id="classDAO" class="dao.impl.ClassDAOImpl" parent="superDAO"></bean>
</beans>
运行时报错:
4:42:17,031 WARN RequestProcessor:516 - Unhandled Exception thrown: class org.springframework.beans.factory.BeanNotOfRequiredTypeException
04:42:17,062 ERROR [action]:253 - Servlet.service() for servlet action threw exception
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named '/classManage' must be of type [org.apache.struts.action.Action], but was actually of type [$Proxy0]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:737)
at org.springframework.web.struts.DelegatingActionProxy.getDelegateAction(DelegatingActionProxy.java:127)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:109)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at action.MyActionServlet.process(MyActionServlet.java:16)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
大概的意思是拦截的对象应该是个Struts的Action类,但是现在拦截到的是个代理。
但是spring整合struts本身用的确实是代理org.springframework.web.struts.DelegatingActionProxy,请问有经验的朋友如何解决,谢谢!