JAVA香滿世界

          我愛JAVA

          統(tǒng)計(jì)

          留言簿(2)

          閱讀排行榜

          評(píng)論排行榜

          2007年4月10日 #

          (轉(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 @ 2007-04-10 18:30 chengjie 閱讀(1607) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 永胜县| 化隆| 南涧| 崇州市| 桃江县| 商河县| 门头沟区| 潜江市| 革吉县| 锡林郭勒盟| 哈巴河县| 乌海市| 辽宁省| 广灵县| 军事| 永年县| 五原县| 青龙| 错那县| 泾阳县| 花垣县| 垫江县| 突泉县| 富平县| 通州市| 塘沽区| 云南省| 临海市| 南宫市| 铜梁县| 阜新市| 聂荣县| 平舆县| 临洮县| 长汀县| 青岛市| 商河县| 湘潭市| 孟津县| 桃源县| 镇康县|