mybatis啓動報錯,sqlSession 或者 sqlSessionTemplate報錯

首先看一下錯誤日誌
日誌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的源碼了啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章