`

(错误问题解决)手动|自动装配Spring与Webwork配置 修改spring-xwork-integration.jar方法实现

阅读更多

我在网上看到一个spring 结合webwork的实例,自己弄了一下,发现老出现一个奇怪的错误

按照下面的配置,会出现一个一样的错误

 

严重: Could not execute action
java.lang.IllegalStateException: The application context has not been set on this resolver
 at com.opensymphony.xwork.spring.SpringExternalReferenceResolver.resolveReferences(SpringExternalReferenceResolver.java:38)
 at com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor.before(ExternalReferencesInterceptor.java:40)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:34)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35)
 at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165)
 at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:115)
 at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:229)
 at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
 at java.lang.Thread.run(Unknown Source)

 

我使用的是spring-xwork-integration.jar 这jar包来在webwork的action里面IOC注入spring的bean对象,异常提示的代码: The application context has not been set on this resolver 经分析就是在spring-xwork-integration.jar 的SpringExternalReferenceResolver里,其中一段代码如下

 

  public void resolveReferences(ActionInvocation paramActionInvocation)
    throws ReferenceResolverException
  {
    if(this.applicationContext == null) throw new IllegalStateException("The application context has not been set on this resolver");

 

 

--------------------

 

}

也就是说方法里的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里的listener

 

代码里主要片段:

 

  public void contextInitialized(ServletContextEvent paramServletContextEvent)
  {
    ServletContext localServletContext = paramServletContextEvent.getServletContext();
    WebApplicationContext localWebApplicationContext = WebApplicationContextUtils.getWebApplicationContext(localServletContext);
    SpringObjectFactory localSpringObjectFactory = new SpringObjectFactory();
    localSpringObjectFactory.setApplicationContext(localWebApplicationContext);
    ObjectFactory.setObjectFactory(localSpringObjectFactory);
  }

 

 里面是可以得到applicationContext 对象的,但是手工装配的SpringExternalReferenceResolver里没有给applicationContext 赋值,所以报错了,所以我更改了jar里的类,我首先用jd-gui.exe反编译jar,把这3个文件修改了

主要是在SpringObjectFactoryListener里新增一个静态实例变量

 

public static org.springframework.context.ApplicationContext.ApplicationContext aplicationContextWeb = null;

 

然后再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里的listener

 

2个位置对调,变成

 
  <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>   
 

系统又会出错,这个问题更复杂,具体原因我还不是是否清楚。有哪位精通的高手给我答案吗???????????

 

--------------这个问题我现在分析了spring-xwork-integration.jar里的java文件,发现原来jar里需要把ServletContextEvent 通过spring提供的WebApplicationContextUtils.getWebApplicationContext()来转换

成spring自己的ApplicationContext,所以说,必须选侦听spring的ContextLoaderListener,在侦听SpringObjectFactoryListener,位置不能反,否则会报错。

 

 

谢谢啦!!!!!!!!!!!!!!!!!!
 

附近里的第一个jar文件是我修改过的!!!!!!!!!!!!!!(这后来发现是垃圾,可能被删除过文件的)

第二个jar包是比较完整的,是正确的

2010-5-26 18:19 我此时才发现,我在公司使用的spring-xwork-integration.jar 有重大问题,大小才8k不到,靠,郁闷啊,好像不对的,真正的spring-xwork-integration.jar应该比这个大,而且里面不止3个class,估计问题出在这里(当然也不排除jar的版本问题,但是我不知道怎么看版本,也许第二个jar包的版本比较新吧,只能猜测。),上面的错误也跟这个jar包有关,新的jar换上去,问题就解决了,哈哈。垃圾啊,被人陷害了。怪不得网上找这问题,答案非常少啦,原来是这么回事。

spring-xwork-integration-2.jar 是我自己修改过的jar,按下面配置,可以自动装配的,不是原文说的手动,需要要手动,则使用
第二个 spring-xwork-integration.jar (10.1 KB)

------------------------------------------------下面是我看到的例子 原文在http://gis8.blog.sohu.com/41790075.html ----------------------------------------------------------------------------

 一个手动装配的Spring与Webwork集成配置示例

分享
标签: webwork  spring  集成  配置  手动装配 

在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.SpringObjectFactoryListener</listener-class>
 </listener--> 

--------------这个侦听器好像是旧版本的,比较新的版本已经改为SpringExternalReferenceResolverSetupListener了,看不到这个SpringObjectFactoryListener了

xwork.xml文件,如下:
1 <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
2 "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
3 <xwork>
4 <include file="webwork-default.xml"/>
5 <!-- 注意是com.opensymphony.xwork.spring.SpringExternalReferenceResolver -->
6 <package name="myDefault" extends="webwork-default" 
7  externalReferenceResolver="com.opensymphony.xwork.spring.SpringExternalReferenceResolver">
8  <interceptors> <!-- 定义一组拦截器 -->
9     <interceptor name="myReferenceResolver" <!--不使用自动装配时,使用ExternalReferencesInterceptor-->
10           class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
11    <interceptor-stack name="myDefaultStack">
12      <interceptor-ref name="defaultStack"/>
13       <interceptor-ref name="params"/>
14       <interceptor-ref name="myReferenceResolver" />
15      </interceptor-stack>
16    </interceptors>
17   <default-interceptor-ref name="myDefaultStack"/> <!-- 名称与第11行相同,指定默认的拦截器-->
18  </package>
19 </xwork>

自定义的Action配置文件,样式如下:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"><xwork>
 <package name="demo" extends="myDefault" >
  <action name="demo" class="com.demo.DemoAction">
   <external-ref name="demoLogic">myLogic</external-ref><!-- 这时外部引用Bean名称与Action属性名称可以不相同,使用ActionAutowiringInterceptor时很难做到这一点-->
   <result name="success">test.jsp</result>
  </action>
 </package>
</xwork>

<script></script>
分享到:
评论

相关推荐

    webwork-2.1.7 xwork.jar

    webwork 2.1.7 版 原版留存 xwork.jar

    webwork-2.1.jar webwork相关jar包

    webwork-2.1.jar webwork相关jar包

    atlassian-xwork-core-1.10-beta1.jar.zip

    《Atlassian XWork Core 1.10 Beta1:核心框架与开发实践》 Atlassian XWork Core 1.10-beta1.jar 是一个重要的Java库,它属于Atlassian产品系列的一部分,主要用于构建企业级应用。XWork Core是Atlassian公司开发...

    webwork的jar包

    "webwork2.2.4%2Bspring%2Bhibernate"可能是一个包含了整合WebWork 2.2.4、Spring和Hibernate配置的子目录或文件,这通常包括配置文件(如web.xml、struts-config.xml等)、类库和可能的示例代码,帮助开发者快速...

    web项目常用jar包及说明.zip

    10.struts2-spring-plugin-2.1.8.jar(struts2与spring集成时使用的) Spring需要的jar包: 1.spring.jar(里面含有spring的所有核心类库) 2.commons-logging-1.1.1.jar(ASF出品的日志包,struts2 2、spring、...

    MyEclipse_9创建SSH2开发环境必须的独立包

    xwork-2.0.5.jar webwork的核心库 ognl-2.6.11.jar OGNL表达式语言,struts2支持该EL freemarker-2.3.8.jar 表现层框架,定义了struts2的可视组件主题 commons-beanutils.jar 提供对java 反射和自省API的包装 ...

    xwork-core

    xwork的核心jar包 由于struts2是webwork的升级版本 所以必定对其有所依赖 struts2在其基础上构建

    spring与webwork框架集成

    WebWork2.1 与 Spring 框架的集成是一个常见的技术实践,目的是利用 Spring 提供的依赖注入(DI)和面向切面编程(AOP)能力,以及 WebWork 的优秀动作层管理,来构建更加灵活和解耦的Java Web应用。在集成过程中,...

    webwork2-spring.jar

    用于集成WebWork2.1和Spring的一个jar文件,编译级别jdk1.4, 已测试过,可以整合

    webwork2.1 spring

    `spring-xwork-integration.jar`可能包含Spring与WebWork之间的桥接代码,用于协调两者之间的通信,例如处理Action的生命周期管理和服务注入。`webwork2-spring.jar`则可能包含WebWork框架内针对Spring的适配器和...

    webwork与spring集成

    WebWork框架与Spring框架的集成便是一个典型示例,它结合了WebWork在MVC架构方面的优势与Spring在依赖注入(DI)和面向切面编程(AOP)方面的能力,为开发者提供了更为灵活和强大的解决方案。本文将深入探讨WebWork...

    appfuse-light-webwork-spring-jdbc-1.8.2.zip_Java 8_appfuse_webwo

    Stream API为处理集合提供了新的方式,而日期和时间API的改进则解决了原来日期处理中的复杂问题。 **AppFuse** AppFuse是一个模块化的框架,它整合了多个流行的技术,如Spring、Hibernate、Struts和WebWork等。在这...

    SSH 项目 整合jar包

    10.struts2-spring-plugin-2.1.8.jar(struts2与spring集成时使用的) 二、Spring需要的jar包: 1.spring.jar(里面含有spring的所有核心类库) 2.commons-logging-1.1.1.jar(ASF出品的日志包,struts2 2、spring、...

    SSH 框架所需JAR包

    10.struts2-spring-plugin-2.1.8.jar(struts2与spring集成时使用的) Spring需要的jar包: 1.spring.jar(里面含有spring的所有核心类库) 2.commons-logging-1.1.1.jar(ASF出品的日志包,struts2 2、spring、...

    webWork,xwork.xml,web.xml配置

    在WebWork的配置中,`xwork.xml`和`web.xml`两个文件起着至关重要的作用。 首先,让我们详细了解一下`xwork.xml`配置文件。这个文件主要负责定义Action类、拦截器(Interceptor)、包(Package)以及相关的参数。...

    webwork-2.2.2和xwork1.1.3的jar包and源代码

    这个压缩包包含的文件是WebWork 2.2.2和XWork 1.1.3版本的JAR包以及相关的源代码,这对于开发者来说是一份宝贵的参考资料。 WebWork是一个轻量级的MVC框架,它通过使用动作(Action)和结果(Result)的概念来处理...

    webwork-spring-hibernate.rar_spring_webwork

    标题中的"webwork-spring-hibernate.rar_spring_webwork"暗示了这个压缩包涉及的是一个集成WebWork、Spring和Hibernate的项目。这三个框架是Java Web开发中的重要组件,分别负责不同的职责:WebWork(或Struts)是...

    webwork-2.2.5源码包下载.txt

    3. **社区交流**:加入WebWork的开发者社区,如论坛、邮件列表等,可以与其他开发者交流经验、解决问题,这对于深入理解框架的内部机制非常有帮助。 4. **实战演练**:理论学习之后,最重要的还是实践操作。可以...

Global site tag (gtag.js) - Google Analytics