Sparta Yew

     简约、职业、恒久
随笔 - 15, 文章 - 1, 评论 - 276, 引用 - 0
数据加载中……

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/
            SpartaYew@163.com
 
            
QQ:22086526

posted on 2011-05-18 21:56 sparta-紫杉 阅读(1225) 评论(0)  编辑  收藏 所属分类: SSH2


只有注册用户登录后才能发表评论。


网站导航: