海水正藍(lán)

          面朝大海,春暖花開
          posts - 145, comments - 29, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [轉(zhuǎn)]CXF脫離Spring運(yùn)行

          Posted on 2013-01-24 16:30 小胡子 閱讀(3270) 評論(0)  編輯  收藏 所屬分類: Spring

          CXF和Spring結(jié)合的非常緊密,默認(rèn)發(fā)布Server端是需要用到Spring的,但是項目中用到的Spring jar包比較老2.0,CXF版本2.3.1,跟Spring不兼容,需要換乘Spring2.5,但是換jar包對原來的項目存在風(fēng)險,上網(wǎng)搜了一個脫 離Spring運(yùn)行的方法。

           

          寫一個類繼承CXFNonSpringServlet,重寫loadBus方法。


           1 @SuppressWarnings("unchecked")
           2     public void loadBus(ServletConfig servletConfig) throws ServletException {
           3         super.loadBus(servletConfig);
           4         Bus bus = this.getBus();
           5         BusFactory.setDefaultBus(bus);
           6         
           7         Enumeration<String> enums = getInitParameterNames();
           8         while (enums.hasMoreElements()) {
           9             String key = enums.nextElement();
          10             String value = getInitParameter(key);
          11             try {
          12                 Class clz = Class.forName(value);
          13                 try {
          14                     Endpoint.publish(key, clz.newInstance());
          15                 } catch (InstantiationException e) {
          16                     e.printStackTrace();
          17                 } catch (IllegalAccessException e) {
          18                     e.printStackTrace();
          19                 }
          20             } catch (ClassNotFoundException e) {
          21                 e.printStackTrace();
          22             }
          23         }
          24     }

          在web.xml里將要發(fā)布的類配置一下,可以配置多個

           1     <servlet>  
           2              <servlet-name>CXFServlet</servlet-name>  
           3              <servlet-class>  
           4                   com.infodms.ws.util.MyCXFNoSpringServlet  
           5              </servlet-class>  
           6              <init-param>  
           7                 <param-name>/TestService</param-name>  
           8                 <param-value>com.infodms.ws.test.TestServiceImpl</param-value>  
           9              </init-param>  
          10              <init-param>  
          11                 <param-name>/HelloWorld</param-name>  
          12                 <param-value>com.infodms.ws.test.HelloWorldImpl</param-value>  
          13              </init-param>  
          14          </servlet>  
          15          <servlet-mapping>  
          16              <servlet-name>CXFServlet</servlet-name>  
          17              <url-pattern>/ws/*</url-pattern>  
          18          </servlet-mapping> 

          配置完成,啟動tomcat,報錯,還是加載了spring,但是代碼確實走了剛剛加的MyCXFNoSpringServlet

          1     java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.bus.spring.BusApplicationListener' defined in class path resource [META-INF/cxf/cxf.xml]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.springframework.context.support.AbstractApplicationContext.addApplicationListener(Lorg/springframework/context/ApplicationListener;)V  
          2         org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:96) 

          調(diào)試了一下源碼,內(nèi)部需要從環(huán)境變量中取得org.apache.cxf.bus.factory的值,如果為空就默認(rèn)按照spring的方式加載。于是在類的最開始加入一行代碼

          1 System.setProperty("org.apache.cxf.bus.factory""org.apache.cxf.bus.CXFBusFactory"); 

          再次啟動tomcat,報錯,由異常可知WoodstoxValidationImpl類沒有默認(rèn)構(gòu)造方法,通過反射實例化對象報錯,看了一下這個類的源碼,確實沒有無參構(gòu)造方法

          1     Caused by: java.lang.InstantiationException: org.apache.cxf.wstx_msv_validation.WoodstoxValidationImpl   
          2             at java.lang.Class.newInstance0(Class.java:340)   
          3             at java.lang.Class.newInstance(Class.java:308)   
          4             at org.apache.cxf.bus.extension.Extension.load(Extension.java:110)  


          http://cxf.547215.n5.nabble.com/jira-Created-CXF-3077-java-lang-InstantiationException-org-apache-cxf-wstx-msv-validation-WoodstoxVal-td3228305.html

          引用這個,加入三個jar包

          woodstox-core-asl-4.0.8.jar 
          stax2-api-3.0.2.jar
          msv.jar

           

          問題解決。

          原文出自:
          http://liuqiang5151.iteye.com/blog/840496
          主站蜘蛛池模板: 正定县| 从江县| 清丰县| 蒲江县| 资兴市| 襄城县| 唐山市| 南安市| 永寿县| 涿州市| 张家港市| 营山县| 尼木县| 南京市| 昌乐县| 莱阳市| 凤庆县| 大英县| 确山县| 华安县| 扬州市| 德惠市| 怀柔区| 和政县| 宁南县| 新兴县| 乐陵市| 曲沃县| 黄陵县| 讷河市| 巴塘县| 安图县| 荆门市| 务川| 文登市| 西乌珠穆沁旗| 安福县| 高雄县| 黄山市| 建德市| 潜江市|