首先看一下錯誤日誌:
日誌1:Error creating bean with name ‘nShopScoreActivityMapper’: Unsatisfied dependency expressed through field ‘sqlSession’; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘sqlSessionTemplate’ defined in class path resource[org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Unsatisfied dependency expressed through method ‘sqlSessionTemplate’ parameter 0;
日誌2:Could not resolve type alias ‘BaseResultMap’. Cause: java.lang.ClassNotFoundException: Cannot find class: BaseResultMap
簡單的貼一下項目代碼:
<resultMap id="BaseResultMap"
type="com.gomeplus.bs.interfaces.score.entity.NShopScoreRule">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="join_id" property="joinId" jdbcType="INTEGER" />
</resultMap>
<!-- 排查完之後,才發現,此處應該是resultMap而不應該是resultType。又因爲是generator生成的配置文件,我們
的result標籤的id的屬性都是BaseResultMap,排查問題的時候也是有些麻煩的,其實,我們可以把每個頁面的
BaseResultMap重新定義一下,這樣也好方便我們查詢 -->
<!-- <select id="selectByPrimaryKey" resultMap="BaseResultMap" -->
<select id="selectByPrimaryKey" resultType="BaseResultMap"
parameterType="java.lang.Integer">
select
<include refid="Base_Column_List" />
from nshop_score_rule
where id = #{id,jdbcType=INTEGER}
</select>
日誌分析:
這個日誌,其實報的是xml的錯誤,mybatis會把第一個mapper.xml文件給拋出來,也就是nShopScoreActivityMapper.xml。這會讓你以爲是那個配置文件的問題,但事實上不一定是那個配置文件的問題,可能是其餘的mapper的問題,但可以確定的是,應該是就是mybatis的配置文件的問題。
再看日誌2,說Could not resolve type alias ‘BaseResultMap’,那麼可能是一個別名叫BaseResultMap的附近引發的問題。
代碼報錯的場景是:
項目之前一直都是好使的,就是在項目合併的時候,合併完同事代碼,再啓動的時候,mybatis就報這個錯誤。
問題解決步驟:
1.在junit測試類中寫測試,啓動項目,查看項目是否能啓動
2.在mybatis-config.xml中,少引入幾個配置文件,也就是mappers標籤中引入的資源少引入幾個,先引入一個,啓動下再試試看好不好使
3.最終發現,我的項目是引入到一個 NShopScoreRuleMapper.xml 配置文件,啓動報錯的
4.排查 NShopScoreRuleMapper.xml 文件,尤其是 BaseResultMap 附近的內容,最終發現問題所在:
問題就是resultMap被同事寫成了resultType。
<select id="selectByPrimaryKey" resultType="BaseResultMap"/>
修改代碼爲
<select id="selectByPrimaryKey" resultMap="BaseResultMap"/>
5.問題解決
問題反思:
1.真的,不管怎樣,一定要在本地代碼沒問題,才能提交代碼,要不然,真的是很麻煩的
2.如果之前好使,那就看一下日誌,把項目版本還原到上一個版本,再試試好使不
3.看一下本次代碼合並過來的是什麼內容,重點排查下這部分更新下來的代碼
4.mybatis的實體類,儘量全用 包裝類(Integer、Long)這樣的修飾,因爲有的時候,我們可能在mapper配置文件中配置的時候,大多數習慣都是按照對象爲null的判斷,這種時候,你要是一個對象中沒有傳那個值得話,mybatis可能就會報空指針的異常
5.感覺有必要擼一下mybatis的源碼了啊