spring整合struts使用AOP拦截action不成功,如何解决?

dgqbcht 2007-12-27 05:04:31
想用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,请问有经验的朋友如何解决,谢谢!
...全文
1322 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pnar2008 2010-01-06
  • 打赏
  • 举报
回复
Action 是否继承 extends DispatchAction
dgqbcht 2007-12-29
  • 打赏
  • 举报
回复
目前折衷的解决方案只有自己写个MyDelegatingActionProxy,继承DelegatingActionProxy,然后override里面的execute方法,直接在这里做判断,跟aop使用代理的思想一致,但没有能够真正用到springframework里的aop。
myth822 2007-12-29
  • 打赏
  • 举报
回复
没有做过对action的拦截,不过看了一下
getDelegateAction中的方法是
return (Action) wac.getBean(beanName, Action.class);
所以spring总会验证你的类是否是Action的子类

你可以用正则拦截execute方法来代替拦截action类
for_cyan 2007-12-29
  • 打赏
  • 举报
回复
既然用了DelegatingActionProxy,就在spring的配置文件中配置所有的bean,包括struts的action
在/WEB-INF/applicationContext.xml设置AOP代理,以及拦截的bean,其实struts的配置文件完全可以省略了
不过你用插件的方式加载sping的话就不能省了,最好用listener和servlet
karlpan01 2007-12-29
  • 打赏
  • 举报
回复
呵呵,我只能帮你顶!
yang_j2ee 2007-12-29
  • 打赏
  • 举报
回复
好象是你在Struts-config中没有设置启动容器为Spring..

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧