Mule ESB Http項目轉換爲Tomcat項目(8) 與Spring的結合(Web項目改造)

     (7)中在ESB項目中集成了Spring項目,可是在移植到Web項目並不能原樣移植過去,須要作一些修改。java

    1.首先將ESB項目新增的代碼文件,配置文件和第三方pom引用更新到Web項目中。 mysql

    2.修改pom文件中的maven-war-plugin,將conf目錄下的applicationContext.xml文件拷貝到WEB-INF/conf目錄下:  web

<resource>
  <targetPath>WEB-INF/conf</targetPath>
  <directory>src/main/app/conf</directory>
  <includes>
    <include>*.xml</include>
  </includes>
</resource>

      再在流程文件中修改導入applicationContext.xml文件的路徑spring

<spring:beans>
    <spring:import resource="WEB-INF/conf/applicationContext.xml"/>
</spring:beans>

這樣修改好後,部署到tomcat運行時,將會出現如下異常:sql

java.io.FileNotFoundException: 
Cannot create a relative resource for resource WEB-INF/testproject.xml

修改上面的targetPath爲WEB-INF, import resources path爲"applicationContext.xml",仍然會出現這樣的問題,這表示mule在加載applicationContext.xml文件時,沒法從流程文件的路徑找到applicationContext.xml的相對路徑,加載失敗,最後咱們將targetPath設置爲WEB-INF/classes,resources path設置爲「classpath*:/applicationContext.xml」,啓動時再也不出現找不到相對路徑的錯誤,可是又拋出瞭如下異常:數據庫

Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexp
ected exception parsing XML document from URL [file:/D:/tomcat7/apache-tomcat-7.
0.69/webapps/testproject/WEB-INF/classes/applicationContext.xml]; nested excepti
on is org.springframework.beans.FatalBeanException: Class [org.springframework.c
ontext.config.ContextNamespaceHandler] for namespace [http://www.springframework
.org/schema/context] does not implement the [org.springframework.beans.factory.x
ml.NamespaceHandler] interface

    可是查看Spring的源碼,ContextNamespaceHandler類明明實現了NamespaceHandler接口的,定位這個問題的緣由找了好久。apache

   首先我在google上查到是由於沒有導入spring的web和webmvc jar包,但是當我在項目中添加了spring web和spring web mvc兩個jar包的引用後,啓動仍然會報這個錯誤。後來我想到了,mule在加載spring配置文件時,是使用它自帶的spring 4.1.6的庫,而個人項目引入了spring 4.3.0的庫,致使mule加載spring配置文件時,類加載出現了庫衝突,從而致使了這個問題。tomcat

在anystudio中啓動ESB項目時,mule ESB運行時優先加載運行時環境下的spring 4.1.6庫文件,所以不存在此問題。mvc

  找到這個緣由後,解決方案就簡單了,在web項目的pom文件中,將全部引用到spring庫的dependency的scope都設置爲provided,不包含到生成的war包中,運行時直接使用mule lib目錄下自帶的spring 4.1.6庫。修改好後從新部署web項目,啓動時Web項目正常啓動。app

  可是當我調用Web項目接口時,後臺拋出No Suitable Driver for jdbc:mysql........的異常信息,這個問題和ESB項目運行時的問題是同樣的,解決方案也相同,將mysql driver jar包拷貝到mule的lib目錄下,使得mule加載spring配置文件時,能找到對應的數據庫驅動,創建對應的數據源,從而成功初始化Jdbc Template,固然在pom文件中一樣要把mysql的jar引用scope改成provided。

  複製完成後從新啓動項目,調用Web接口,得到的結果和ESB項目徹底一致,說明咱們對集成了Spring的ESB項目的改造徹底成功。

 

      然而這個Web項目的改造還存在問題,若是存在多個ESB項目改造的Web項目,這些Web項目都使用共通的數據源配置,若是仍是在每一個項目裏都設置數據源鏈接信息,不只會出現配置信息冗餘,並且會給未來的配置更新帶來麻煩,所以咱們想到了使用Tomcat Data Source,在Tomcat的配置文件中配置數據源,而在Web項目中使用JNDI方式訪問這個數據源。

     咱們先在Tomcat的server.xml文件裏添加Tomcat的Data Source配置

<GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
    <Resource name="jdbc/TestDB"
		      global="jdbc/TestDB"
		      auth="Container"
              type="javax.sql.DataSource"
              username="root"
              password="admin"
              url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8"
              driverClassName="com.mysql.jdbc.Driver"
              initialSize="10"
              maxWaitMillis="15000"
              maxTotal="75"
              maxIdle="20"
              maxAge="7200000"
              testOnBorrow="true"
              validationQuery="select 1"
         />
  </GlobalNamingResources>

再修改context.xml文件,添加如下配置

<ResourceLink name="jdbc/MyLocalDB"
                    global="jdbc/TestDB"
                    auth="Container"
                    type="javax.sql.DataSource" />

最後修改applicationContext.xml,添加對JNDI DataSource的引用

<jee:jndi-lookup expected-type="javax.sql.DataSource"
    		id="dataSource" jndi-name="java:comp/env/jdbc/MyLocalDB"/>

在applicationContext.xml的頭部添加jee的prefix定義

xmlns:jee="http://www.springframework.org/schema/jee" 
.............
http://www.springframework.org/schema/jee 
http://www.springframework.org/schema/jee/spring-jee-4.0.xsd

最後將mysql connector的jar文件拷貝到tomcat的lib目錄下

從新運行Tomcat,調用Web接口,結果和使用spring jdbc template的效果同樣。

相關文章
相關標籤/搜索