最近在使用由maven構建的多模塊項目,在開發過程中遇到了一些問題,在此記下解決的方法希望對出現同樣或類似問題的朋友有所幫助。
轉載自博客園本文鏈接地址: maven多模塊Springmvc+mybatis讀取配置文件和注入bean
項目技術:maven,springmvc,mybatis
項目結構:
+++++++++++++++++++++
+ root
-> pom.xml
+ dao
+ service
+ common
+ web
+++++++++++++++++++++
root:是父模塊,dao,service,common,web分別是四個子模塊,每個子模塊是一個單獨的工程,由maven管理依賴關系來實現相互的調用。依賴關系的建立就是在pom.xml中通過dependency來實現。
dao:工程是負責數據庫訪問的,其中包含了mybatis的映射文件、dao的數據訪問接口和spring-mybatis.xml配置文件(配置數據庫連接和數據源信息)。
service:工程負責業務邏輯處理,其中包含業務邏輯處理接口與實現類。
common:工程主要放置常量、工具類等
web:工程負責視圖與請求控制,其中包含web.xml、spring-mvc.xml,請求控制類等。
以上是項目的整體介紹,下面將主要闡述在開發中遇到的問題。
注:整個項目使用Spring的注解方式來實現管理。
dao模塊的配置文件讀取問題
由於部署的只有web工程,其他工程最后會被Maven打成jar作為web工程的依賴進行調用。同時web項目在啟動時只會加載WEB-INF目錄下的配置文件,這就會導致jar包里的配置文件無法被讀取,最終無法實例化service和dao的bean,導致調用失敗。
解決辦法:在web.xml里加入
<!-- 加載spring的xml配置文件到 spring的上下文容器中 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:xxx.xml</param-value> </context-param>
注:加載jar包中的配置文件可能會出現無法支持通配符的情況,如果有多個配置文件需要一個一個的加 例:
<!-- 加載spring的xml配置文件到 spring的上下文容器中 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:xxx1.xml,xxx2.xml </param-value> </context-param>
另外在網上也看到說以上方法仍無法加載,並提供了解決辦法,由於本人使用以上方法已經成功,無法進行驗證,但還是貼出來供大家參考:
<!-- 加載spring的xml配置文件到 spring的上下文容器中 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:xxx1.xml,xxx2.xml </param-value> </context-param>
辦法就是在classpath后加*號 ,網上的解釋是classpath 只會在classpath中查找 ,classpath*會在classpath和所有的jar包中進行查找。這個在第二個問題中用到了
配置文件加載成功,但提示dao的bean綁定無效
在調用過程中使用的是@AutoWired自動注入的形式。出現綁定無效的情況大致分為以下幾種情況。
a、配置文件中未開啟支持注解的方式注入
<!--查看配置文件中是否有以下代碼--> <context:component-scan base-package="..."></context:component-scan> <!--這個代碼是開啟包自動掃描同時開起對注解的支持-->
b、映射文件的namespace引用路徑錯誤
由於使用了spring版本是支持mybatis3的,可以通過配置
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="..." /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>
來達到不需要dao實現類的目的。但同時需要映射文件中的namespace中的類路徑必須和dao接口類路徑一致,dao接口類中的方法名與映射文件中的CRUD方法的id一致。
c、映射文件中沒有dao接口類中調用的方法。
b中提到了dao接口類的方法名需要和映射文件中的方法id一致,如果不一致將無法對應
d、如果上述的問題都不存在(本人也是沒有上述問題),那么我們再回到配置文件中
我們在整合spring和mybatis的時候往往會去掉mybatis的配置文件,需要在配置文件中配置
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自動掃描mapping.xml文件 --> <property name="mapperLocations" value="classpath:xxx/xxx/*.xml"></property> </bean>
從上面的配置信息中我們又看到了classpath,在第1個問題中我們提到過,classpath只會在classpath中查找 ,dao模塊已經是以jar包的形式存在了 ,因此 classpath應該是web工程的,所以找不到。
解決辦法就是在classpath后加一個*就解決了
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自動掃描mapping.xml文件 --> <property name="mapperLocations"value="classpath*:xxx/xxx/*.xml"></property> </bean>
經過junit和部署到tomcat中均已測試成功。
以上就是本人遇到的問題和解決辦法。