`
edwardpro
  • 浏览: 315813 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

彻底解决webwork2.2.4和spring的集成问题

阅读更多

记得前些日子帖过一个大骂webwork2.2.4的帖子,其实那个问题后来解决了,为什么会突然说这个对于已经是古老的问题呢?同事今天迁移平台代码,发现原来的那套程序怎么跑都是不能用,他开始搜索gg,居然找到了我的blog,我这才想起来我痛苦的那几日,为了不让其他xdjm犯同样的错误,所以决定仔细分析下,告诉大家来龙去脉,搞定webwork2.2.x和spring的整合功能。

首先回放下问题:
ERROR [http-8080-Processor25] (DispatcherUtils.java:237) - Could not execute act
ion
java.lang.NullPointerException
       at com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringI
nterceptor.findAutoWiringBeanFactory(SessionContextAutowiringInterceptor.java:68
)
       at com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringI
nterceptor.before(SessionContextAutowiringInterceptor.java:57)
       at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(Around
Interceptor.java:30)
       at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionIn

实际上这个问题简单描述为:当webwork启动spring交互时却发现spring的上下文是一个空值,怎么会呢?问题就出在webwork2.2.4最新的整合代码里,之前的版本至少2.2.2是需要另外cp一个jar包才能进行这种全整合的,而2.2.4的新特性之一就是已经整合在了webwork里,但这恰恰是场恶梦。原因来自于他的一个代码缺陷。
其实webwork的整合原来很简单,利用webwork的拦截器,首先他从内存获得spring的上下文,然后当得到actionbean的名字之后就从spring也得到这个注入bean的内容,然后利用其中的属性拷贝类,把spring内的内容复制到action上,就完成了所谓的整合。
首先看webwork2.2.4的源代码:
       Map session = invocation.getInvocationContext().getSession();
       ApplicationContext applicationContext = (ApplicationContext) session.get(ApplicationContextSessionListener.APP_CONTEXT_SESSION_KEY);
大概意思就是从session中取得了context,不过他的方法是从拦截器里取得的,但这个方法鉴定下来是不行的,造成了applicationContext是一个Null!我们之前的错误也是这里引起的。
我参考了之前使用的一个webwork植入spring的类,其实方法完全一样,也是通过取得上下文,然后利用beanuntilcopy属性到action这样的方法,下面来看看我修正过的代码:
    Map session = invocation.getInvocationContext().getSession();
    ApplicationContext applicationContext = (ApplicationContext)ActionContext.getContext().getApplication().get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
如此简单就ok其实就是这个session对象的名字,我是参考了spring本身的webuntil里的写法改写的,这个应该不会有任何问题。
现在覆盖上去看看是否ok了?问题解决。

 

ps:webwork是好东西几次想封装webwork的action都失败了,说明webwork已经把能想到的方便都做了,也就没有需要封装的内容。不过他的bug也是比较多的至少明显比spring hibernate这种流行框架多,当然也许是太复杂了,没有用好吧:)

分享到:
评论
1 楼 syring 2007-08-22  
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 是那个包里的?

相关推荐

    webwork 2.2.4开发指南

    2. 与SpringMVC:虽然两者都是MVC框架,但WebWork更注重轻量级和开发效率,而SpringMVC则集成了更多Spring生态的特性。 六、WebWork进阶 1. AOP(面向切面编程):WebWork的拦截器机制是AOP的一种实现,可以扩展出...

    webwork的jar包

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

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 ...

    Spring中文帮助文档

    9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 ...

    Spring API

    9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 ...

    webx3框架指南PDF教程附学习Demo

    Webx 3.0和Spring MVC一样, 完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也...

Global site tag (gtag.js) - Google Analytics