手动装配Spring与Webwork配置的问题研究 高手进(修改spring-xwork-integration.jar方法实现)

问题描述

手动装配Spring与Webwork配置修改spring-xwork-integration.jar方法实现永久链接:http://panshunchang.javaeye.com/blog/675464我在网上看到一个spring结合webwork的实例,自己弄了一下,发现老出现一个奇怪的错误按照下面的配置,会出现一个一样的错误严重:Couldnotexecuteactionjava.lang.IllegalStateException:Theapplicationcontexthasnotbeensetonthisresolveratcom.opensymphony.xwork.spring.SpringExternalReferenceResolver.resolveReferences(SpringExternalReferenceResolver.java:38)atcom.opensymphony.xwork.interceptor.ExternalReferencesInterceptor.before(ExternalReferencesInterceptor.java:40)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:34)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)atcom.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)atcom.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:115)atcom.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:229)atcom.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:729)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)atorg.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)atorg.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)atorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)atorg.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)atorg.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)atorg.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)atorg.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)atjava.lang.Thread.run(UnknownSource)我使用的是spring-xwork-integration.jar这jar包来在webwork的action里面IOC注入spring的bean对象,异常提示的代码:Theapplicationcontexthasnotbeensetonthisresolver经分析就是在spring-xwork-integration.jar的SpringExternalReferenceResolver里,其中一段代码如下publicvoidresolveReferences(ActionInvocationparamActionInvocation)throwsReferenceResolverException{if(this.applicationContext==null)thrownewIllegalStateException("Theapplicationcontexthasnotbeensetonthisresolver");--------------------}也就是说方法里的applicationContext取不到,真奇怪,我在web.xml里配置了该jar包的listener<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class></listener>-----------------这个就是spring-xwork-integration.jar里的listenerSpringObjectFactoryListener代码里主要片段:publicvoidcontextInitialized(ServletContextEventparamServletContextEvent){ServletContextlocalServletContext=paramServletContextEvent.getServletContext();WebApplicationContextlocalWebApplicationContext=WebApplicationContextUtils.getWebApplicationContext(localServletContext);SpringObjectFactorylocalSpringObjectFactory=newSpringObjectFactory();localSpringObjectFactory.setApplicationContext(localWebApplicationContext);ObjectFactory.setObjectFactory(localSpringObjectFactory);}里面是可以得到applicationContext对象的,但是手工装配的SpringExternalReferenceResolver里没有给applicationContext赋值,所以报错了,所以我更改了jar里的类,我首先用jd-gui.exe反编译jar,把这3个文件修改了主要是在SpringObjectFactoryListener里新增一个静态实例变量publicstaticorg.springframework.context.ApplicationContext.ApplicationContextaplicationContextWeb=null;然后到SpringExternalReferenceResolver这个java类里的contextInitialized方法体里赋值aplicationContextWeb=localWebApplicationContext;那么在SpringExternalReferenceResolver里,在使用applicationContext前赋值也就是applicationContext=SpringObjectFactoryListener.aplicationContextWeb;编译好后,打jar包,覆盖原来的,重启tomcat,就通过了手工装配的测试。但是如果在web.xml里把<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class></listener>-----------------这个就是spring-xwork-integration.jar里的listener2个位置对调,变成<listener><listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class></listener>-----------------这个就是spring-xwork-integration.jar里的listener<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>系统又会出错,这个问题更复杂,具体原因我还不是是否清楚。有哪位精通的高手给我答案吗???????????谢谢啦!!!!!!!!!!!!!!!!!!javaeyes里我也发表了,里面可以传文件------------------------------------------------下面是我看到的例子原文在http://gis8.blog.sohu.com/41790075.html----------------------------------------------------------------------------一个手动装配的Spring与Webwork集成配置示例标签:webworkspring集成配置手动装配在web.xml中配置如下内容:<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--有人说这句话要放上,可我发现如果在Webwork2.2.4的webwork.properties配置文件中配置了webwork.objectFactory=spring,则可以去掉,实践出真知哟:-)--><!--listener><listener-class>com.opensymphony.xwork.spring.SpringExternalReferenceResolver</listener-class></listener-->xwork.xml文件,如下:1<!DOCTYPExworkPUBLIC"-//OpenSymphonyGroup//XWork1.0//EN"2"http://www.opensymphony.com/xwork/xwork-1.0.dtd">3<xwork>4<includefile="webwork-default.xml"/>5<!--注意是com.opensymphony.xwork.spring.SpringExternalReferenceResolver-->6<packagename="myDefault"extends="webwork-default"7externalReferenceResolver="com.opensymphony.xwork.spring.SpringExternalReferenceResolver">8<interceptors><!--定义一组拦截器-->9<interceptorname="myReferenceResolver"<!--不使用自动装配时,使用ExternalReferencesInterceptor-->10class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>11<interceptor-stackname="myDefaultStack">12<interceptor-refname="defaultStack"/>13<interceptor-refname="params"/>14<interceptor-refname="myReferenceResolver"/>15</interceptor-stack>16</interceptors>17<default-interceptor-refname="myDefaultStack"/><!--名称与第11行相同,指定默认的拦截器-->18</package>19</xwork>自定义的Action配置文件,样式如下:<!DOCTYPExworkPUBLIC"-//OpenSymphonyGroup//XWork1.0//EN""http://www.opensymphony.com/xwork/xwork-1.0.dtd"><xwork><packagename="demo"extends="myDefault"><actionname="demo"class="com.demo.DemoAction"><external-refname="demoLogic">myLogic</external-ref><!--这时外部引用Bean名称与Action属性名称可以不相同,使用ActionAutowiringInterceptor时很难做到这一点--><resultname="success">test.jsp</result></action></package></xwork>

解决方案

解决方案二:
这是由于我用的spring-xwork-integration.jar有问题,而且class类也只有3个,版本有问题,重新下载一份spring-xwork-integration.jar就可以看到,跟你原来的不一样了,而且你侦听的listener也应该为:<listener-class>org.springframework.web.context.SpringExternalReferenceResolverSetupListener</listener-class>而非<listener-class>org.springframework.web.context.SpringObjectFactoryListener</listener-class>这样就可以了!而且如果要自动装配(也就是xwork里不需要配置external-ref),那么方法有:建立一个拦截器,加到默认的拦截器中,拦截器使用下面方法注入bean到action((AbstractApplicationContext)applicationContext).getBeanFactory().autowireBeanProperties(invocation.getAction(),AutowireCapableBeanFactory.AUTOWIRE_BY_NAME,false);即可
解决方案三:
解决了!学了一些东西!

时间: 2024-09-11 23:31:17

手动装配Spring与Webwork配置的问题研究 高手进(修改spring-xwork-integration.jar方法实现)的相关文章

《Spring实战(第4版)》——第2章 装配Bean 2.1Spring配置的可选方案

第2章 装配Bean 本章内容: 声明bean构造器注入和Setter方法注入装配bean控制bean的创建和销毁在看电影的时候,你曾经在电影结束后留在位置上继续观看片尾字幕吗?一部电影需要由这么多人齐心协力才能制作出来,这真是有点令人难以置信!除了主要的参与人员--演员.编剧.导演和制片人,还有那些幕后人员--音乐师.特效制作人员和艺术指导,更不用说道具师.录音师.服装师.化妆师.特技演员.广告师.第一助理摄影师.第二助理摄影师.布景师.灯光师和伙食管理员(或许是最重要的人员)了. 现在想象一

Spring MVC的配置

Spring MVC 在Spring的体系中和JdbcTemplate互相独立,分属于不同的jar包,使用默认位置不同的spring配置文件. Spring JdbcTemplate基本上完全可以单独拿来使用.也就是说,假如你在写一个Web项目,而且你打算用纯粹的JSP来实现网页的显示.逻辑处理也完全没有任何问题,你只需要在你的JSP页面中创建Spring JdbcTemplate的对象,使用它的方法,在SpringJdbc环境下编写java的方法,让你的JSP页面去使用这些方法,一点问题没有.

Spring中XML配置的12个技巧

Spring利用依赖注入可以获得简单而有效的测试能力.Spring beans,依赖关系,以及服务所需要的bean都将在配置文件中予以描述,配置文件一般采用XML格式.然而XML配置文件冗长而不易使用,在你进行一个使用了大量bean的大项目中它将变得难以阅读和控制. 在这篇文章中我将给你展示12种的有关Spring XML配置文件的最佳技巧.请注意另外一些因素,例如域模型的设计,会影响到XML配置,但是这篇文章更关注于XML配置的可读性和可操控性. 1.避免使用自动装配 Spring可以通过be

spring中bean配置和bean注入

1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用. 1 bean配置 bean配置有三种方法: 基于xml配置Bean 使用注解定义Bean 基于java类提供Bean定义信息 1.1 基于xml配置Bean  对于基于XML的配置,

详解Spring事务Transaction配置的五种注入方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSource.TransactionManager这两部分只是会根据数据访问方式有所变化,

Spring中如何配置DataSource数据源

在Spring框架中有如下3种获得DataSource对象的方法: 1.从JNDI获得DataSource. 2.从第三方的连接池获得DataSource. 3.使用DriverManagerDataSource获得DataSource. 一.从JNDI获得DataSource SpringJNDI数据源配置信息: <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean&qu

Spring Security 2配置精讲 上

安全权限管理手册 http://www.family168.com/oa/springsecurity/html/ 众所周知,Spring Security针对Acegi的一个重大的改进就在于其配置方式大大简化了.所以如果配置还是基于Acegi-1.X这样比较繁琐的配置方式的话,那么我们还不如直接使用Acegi而不要去升级了.所以在这里,我将结合一个示例,重点讨论一下Spring Security 2是如何进行配置简化的. 搭建基础环境 首先我们为示例搭建基本的开发环境,环境的搭建方式,可以参考

Spring Boot自动配置

在上篇文章如何运行Spring Boot应用中,已经熟悉了如何通过maven或者gradle创建一个Spring Boot应用,这篇文章主要学习Spring Boot的自动配置,包括注解的使用以及一些配置约束等等. 关于Spring Boot的特性介绍,可以参考Spring Boot特性. 主应用类 在Spring Boot应用中,我们通常将主应用类放置于应用的根包中,例如,com.javachen.example.主应用类有main方法,并且使用了@EnableAutoConfiguratio

xsd-初学者spring aop/tx配置出现问题不会

问题描述 初学者spring aop/tx配置出现问题不会 错误信息: Multiple annotations found at this line: - schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/context/spring-beans.xsd', because 1) could not find the document; 2) the documen