(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&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的效果同樣。