Spring3中XmlBeanDefinitionReader类的玩笑

Spring3中XmlBeanDefinitionReader类的玩笑

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

    开发环境:spring3.0.2 + struts2.1.8 + hibernate3.3.1 + jdk1.6 + weblogic10.3 + oracle92 + c3p0-0.9.1 + Eclipse3.4.2

    在此开发环境下的项目中,各项配置完毕,之前好好的,但在增加了CXF开发Web Services的功能之后,启动Weblogic10.3一半时,总是提示“c3p0不能加载 oracle.jdbc.driver.OracleDriver”,ClassNotFoundException: oracle.jdbc.driver.OracleDriver.

    开始以为是新增加的采用CXF开发Web Services的功能之后,其中的CXF引用的相关包和Hibernate使用的包有冲突,于是检查,但lib下没有asm,也没有cglib_1.XX.jar,因此并不是jar包有冲突。

    后来以为CXF所带的jar所版本太低(2.0.4,目前已经出了2.2.10),于是首先将所有与CXF有关的所有jar包全部删除。再试验,仍然出现这种问题,极度崩溃中。

    于是从其他方面入手,找啊找, 终于在applicationContext.xml中发现如下语句:

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

      
< property  name ="driverClass" >
               
<!-- 下面<value>oracle.jdbc.driver.OracleDriver</value>语句为两行,导致异常。 -->
               
< value > oracle.jdbc.driver.OracleDriver
               
</ value >
      
</ property >

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

    
    当看到这段代码时,就已经豁然开朗了,基本已经认定就是由于<value>oracle.jdbc.driver.OracleDriver</value>值不在一行的原因(因为之前碰到过这个问题),于是将上述修改为下述:

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

          
< property  name ="driverClass" >
                   
<!-- 下面<value>oracle.jdbc.driver.OracleDriver</value>语句为一行是正常的。 -->
                   
< value > oracle.jdbc.driver.OracleDriver </ value >
          
</ property >

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


    哈哈,看出区别来了吗?一行代码之差就会造成截然不同的两种运行结果。原因很简单,在增加CXF之前,编写的代码均是采用一行来编写的,在增加了CXF之后,为了使XML配置文件的代码更加整齐,于是我在Eclipse中Ctrl + Shift + F了一下,结果配置文件中的配置代码<value>oracle.jdbc.driver.OracleDriver</value>就由一行成为了分开的两行,直接导致了配置的失效。Spring的XmlBeanDefinitionReader类的loadBeanDefinitions()方法跟我们开了一个不大不小的玩笑。于是笔者将两行的<value>oracle.jdbc.driver.OracleDriver</value>代码修改为一行之后,当再启动Weblogic,问题奇迹般的解决了。

    看来,Spring对于XML的解析还是欠缺一些智能化,对于不在同一行的尾标签不能正确识别,不能不说是一种缺陷,或者说是一种Bug。在日益追求灵活编码的程序员身上还是会造成一些不必要的麻烦。记得在Struts2中也出现过此类问题,当时笔者迫不得已针对源码进行了修改。不妨大胆猜测一下,在Spring和Struts中使用的XML解析类均是通用的吧,抑或是这种通用的XML解析是基于“约定优于配置”的原则。但在我看来,这至少是一种缺陷,其中的是非成败只有留给Spring人去评说。



            -东营 sparta-紫杉 原创,转载请注明出处 :)
            http://www.blogjava.net/SpartaYew/
            [email protected]  
            
QQ:2 20 86526

你可能感兴趣的:(Spring3中XmlBeanDefinitionReader类的玩笑)