Sparta Yew

               簡(jiǎn)約、職業(yè)、恒久
          隨筆 - 15, 文章 - 1, 評(píng)論 - 276, 引用 - 0
          數(shù)據(jù)加載中……

          Spring3中XmlBeanDefinitionReader類的玩笑

              
              sparta-紫杉 2010-8-23 18:14

              開(kāi)發(fā)環(huán)境:spring3.0.2 + struts2.1.8 + hibernate3.3.1 + jdk1.6 + weblogic10.3 + oracle92 + c3p0-0.9.1 + Eclipse3.4.2

              在此開(kāi)發(fā)環(huán)境下的項(xiàng)目中,各項(xiàng)配置完畢,之前好好的,但在增加了CXF開(kāi)發(fā)Web Services的功能之后,啟動(dòng)Weblogic10.3一半時(shí),總是提示“c3p0不能加載 oracle.jdbc.driver.OracleDriver”,ClassNotFoundException: oracle.jdbc.driver.OracleDriver.

              開(kāi)始以為是新增加的采用CXF開(kāi)發(fā)Web Services的功能之后,其中的CXF引用的相關(guān)包和Hibernate使用的包有沖突,于是檢查,但lib下沒(méi)有asm,也沒(méi)有cglib_1.XX.jar,因此并不是jar包有沖突。

              后來(lái)以為CXF所帶的jar所版本太低(2.0.4,目前已經(jīng)出了2.2.10),于是首先將所有與CXF有關(guān)的所有jar包全部刪除。再試驗(yàn),仍然出現(xiàn)這種問(wèn)題,極度崩潰中。

              于是從其他方面入手,找啊找, 終于在applicationContext.xml中發(fā)現(xiàn)如下語(yǔ)句:

          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

                
          <property name="driverClass">
                         
          <!--下面<value>oracle.jdbc.driver.OracleDriver</value>語(yǔ)句為兩行,導(dǎo)致異常。-->
                         
          <value>oracle.jdbc.driver.OracleDriver
                         
          </value>
                
          </property>

                
          <property name="jdbcUrl">
                         
          <value>jdbc:oracle:thin:@192.168.0.72:1521:ORA9
                         
          </value> 
                
          </property>
                  ……
          </bean>

              
              當(dāng)看到這段代碼時(shí),就已經(jīng)豁然開(kāi)朗了,基本已經(jīng)認(rèn)定就是由于<value>oracle.jdbc.driver.OracleDriver</value>值不在一行的原因(因?yàn)橹芭龅竭^(guò)這個(gè)問(wèn)題),于是將上述修改為下述:

          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

                    
          <property name="driverClass">
                             
          <!--下面<value>oracle.jdbc.driver.OracleDriver</value>語(yǔ)句為一行是正常的。-->
                             
          <value>oracle.jdbc.driver.OracleDriver</value>
                    
          </property>

                    
          <property name="jdbcUrl">
                             
          <value>jdbc:oracle:thin:@192.168.0.72:1521:ORA9</value>
                    
          </property>
                  ……
          </bean>


              哈哈,看出區(qū)別來(lái)了嗎?一行代碼之差就會(huì)造成截然不同的兩種運(yùn)行結(jié)果。原因很簡(jiǎn)單,在增加CXF之前,編寫(xiě)的代碼均是采用一行來(lái)編寫(xiě)的,在增加了CXF之后,為了使XML配置文件的代碼更加整齊,于是我在Eclipse中Ctrl + Shift + F了一下,結(jié)果配置文件中的配置代碼<value>oracle.jdbc.driver.OracleDriver</value>就由一行成為了分開(kāi)的兩行,直接導(dǎo)致了配置的失效。Spring的XmlBeanDefinitionReader類的loadBeanDefinitions()方法跟我們開(kāi)了一個(gè)不大不小的玩笑。于是筆者將兩行的<value>oracle.jdbc.driver.OracleDriver</value>代碼修改為一行之后,當(dāng)再啟動(dòng)Weblogic,問(wèn)題奇跡般的解決了。

              看來(lái),Spring對(duì)于XML的解析還是欠缺一些智能化,對(duì)于不在同一行的尾標(biāo)簽不能正確識(shí)別,不能不說(shuō)是一種缺陷,或者說(shuō)是一種Bug。在日益追求靈活編碼的程序員身上還是會(huì)造成一些不必要的麻煩。記得在Struts2中也出現(xiàn)過(guò)此類問(wèn)題,當(dāng)時(shí)筆者迫不得已針對(duì)源碼進(jìn)行了修改。不妨大膽猜測(cè)一下,在Spring和Struts中使用的XML解析類均是通用的吧,抑或是這種通用的XML解析是基于“約定優(yōu)于配置”的原則。但在我看來(lái),這至少是一種缺陷,其中的是非成敗只有留給Spring人去評(píng)說(shuō)。



                      -東營(yíng) sparta-紫杉 原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處 :)
                      http://www.aygfsteel.com/SpartaYew/
                      SpartaYew@163.com
           
                      
          QQ:22086526

          posted on 2011-05-18 21:56 sparta-紫杉 閱讀(1242) 評(píng)論(0)  編輯  收藏 所屬分類: SSH2

          主站蜘蛛池模板: 彰武县| 南溪县| 阳东县| 阿荣旗| 始兴县| 饶河县| 沁源县| 阿坝| 宝应县| 抚顺县| 澎湖县| 汉寿县| 柏乡县| 浠水县| 德令哈市| 海林市| 姜堰市| 乌拉特后旗| 靖宇县| 修水县| 海安县| 杨浦区| 崇礼县| 宁晋县| 洛扎县| 浦县| 五原县| 岐山县| 梁山县| 密云县| 黄石市| 松阳县| 澄江县| 启东市| 关岭| 崇明县| 汉川市| 金堂县| 阳城县| 岱山县| 华安县|