记得前些日子帖过一个大骂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这种流行框架多,当然也许是太复杂了,没有用好吧:)
分享到:
相关推荐
最近在做个项目,用的是webwork+spring+hibernate,在网上看了不少webwork+spring的配制方式,大多都是老的配制方式,比如2.1.7的,webwork2.2.4新加了很多功能,和spring的配制也简单了很多,我做了一个简单的登录...
webwork2.2.4架包帮助学习
webwork 2.2.4开发指南
webwork2.2.4的jar包
webwork与spring集成
用于集成WebWork2.1和Spring的一个jar文件,编译级别jdk1.4, 已测试过,可以整合
spring与webwork框架集成详细描述
Webwork+spring+hibernate集成实例
spring与webwork的集成 spring与webwork的集成
webWork2.2+spring +SpringMVC组合 例子
webwork2.24+spring2.0+hibernate3.1三框架整合使用
webwork2.2.7+spring+hibernate+Mysql集成开发用到的包,其中包括了spring Junit4测试包。
webwork2.2.7+spring+hibernate+oracle整合
webwork2.2.7+spring+hibernate分页查询 通过输入用户名获取数据并进行分页
webwork中结合spring说明,自己看吧,对你或许有用
webwork2.1 spring jar包
webwork+spring+ibatis很适合初学者的实例
webwork+spring整合例子 内带使用说明 以及webwork文档(中文) 下载
webwork2.1.7+spring+hibernate+oracle整合
webwork+spring+hibernate整合开发网络书城 第5讲