(轉(zhuǎn))徹底解決webwork2.2.4和spring的集成問題-ERROR [http-8080-Processor25] (DispatcherUtils.java:237) - Could not execute action
記得前些日子帖過一個(gè)大罵webwork2.2.4的帖子,其實(shí)那個(gè)問題后來解決了,為什么會(huì)突然說這個(gè)對(duì)于已經(jīng)是古老的問題呢?同事今天遷移平臺(tái)代碼,發(fā)現(xiàn)原來的那套程序怎么跑都是不能用,他開始搜索gg,居然找到了我的blog,我這才想起來我痛苦的那幾日,為了不讓其他xdjm犯同樣的錯(cuò)誤,所以決定仔細(xì)分析下,告訴大家來龍去脈,搞定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
實(shí)際上這個(gè)問題簡(jiǎn)單描述為:當(dāng)webwork啟動(dòng)spring交互時(shí)卻發(fā)現(xiàn)spring的上下文是一個(gè)空值,怎么會(huì)呢?問題就出在webwork2.2.4最新的整合代碼里,之前的版本至少2.2.2是需要另外cp一個(gè)jar包才能進(jìn)行這種全整合的,而2.2.4的新特性之一就是已經(jīng)整合在了webwork里,但這恰恰是場(chǎng)惡夢(mèng)。原因來自于他的一個(gè)代碼缺陷。
其實(shí)webwork的整合原來很簡(jiǎn)單,利用webwork的攔截器,首先他從內(nèi)存獲得spring的上下文,然后當(dāng)?shù)玫絘ctionbean的名字之后就從spring也得到這個(gè)注入bean的內(nèi)容,然后利用其中的屬性拷貝類,把spring內(nèi)的內(nèi)容復(fù)制到action上,就完成了所謂的整合。
首先看webwork2.2.4的源代碼:
Map session = invocation.getInvocationContext().getSession();
ApplicationContext applicationContext = (ApplicationContext) session.get(ApplicationContextSessionListener.APP_CONTEXT_SESSION_KEY);
大概意思就是從session中取得了context,不過他的方法是從攔截器里取得的,但這個(gè)方法鑒定下來是不行的,造成了applicationContext是一個(gè)Null!我們之前的錯(cuò)誤也是這里引起的。
我參考了之前使用的一個(gè)webwork植入spring的類,其實(shí)方法完全一樣,也是通過取得上下文,然后利用beanuntilcopy屬性到action這樣的方法,下面來看看我修正過的代碼:
Map session = invocation.getInvocationContext().getSession();
ApplicationContext applicationContext = (ApplicationContext)ActionContext.getContext().getApplication().get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
如此簡(jiǎn)單就ok其實(shí)就是這個(gè)session對(duì)象的名字,我是參考了spring本身的webuntil里的寫法改寫的,這個(gè)應(yīng)該不會(huì)有任何問題。
現(xiàn)在覆蓋上去看看是否ok了?問題解決。
posted on 2007-04-10 18:30 chengjie 閱讀(1607) 評(píng)論(0) 編輯 收藏