舊有項目遷移到SpringBoot

最近在做的一個項目因爲需要用到JDK1.8的一些組件所以需要對舊項目升級並轉化爲springboot的web項目分爲以下幾個步驟

1. maven依賴升級
對於大部分業務代碼service和dao層spring是可以做到無縫兼容的,直接升級對面的依賴版本的就可以了
2. xml文件中bean的問題
在spring boot出現之前java web開發一般都是在webapp/WEB-INF下配置一個xml文件在裏面定義各種bean和bean的依賴關係,如數據庫連接配置信息,數據庫連接池bean,mybatis的SqlSessionFactory等bean的依賴關係.
如何輕鬆複用xml文件中定義的bean呢?很簡單
(1)xml文件放在resource目錄下
(2)在springboot啓動的類上添加註解@ImportResource({“classpath:XMLBeans.xml”"}),就可以輕鬆將xml中的bean託管到spring中
(3)檢查各個配置項是否正確,項目能正常啓動運行,如果成功啓動,試試你的接口應該就能正常調用了,恭喜
但是還是一個問題沒有解決,而且很難發現,只會在運行時期暴露出來,對於部分mybatis查詢會報
Parameter '×××' not found. Available parameters are [0, 1, param1, param2]這個異常信息
3. mybatis高版本的兼容性問題
對於低版本的mybatis中極有可能存在通過#{0} #{1}的方式取參數,在spring boot支持的mybatis版本中
是不推薦,也不支持這種寫法的,所以就給我們的遷移工作帶來了巨大的困難,筆者經過分析源碼得到關鍵點在(3.4.6t版本)的類org.apache.ibatis.reflection.ParamNameResolver#ParamNameResolver的第74行關鍵代碼

// @Param was not specified.
//74        if (config.isUseActualParamName()) {
          name = getActualParamName(method, paramIndex);
        }

原來只需要把configuration的useActualParamName配置成false就支持#{0} #{1}取參數了
於是信心滿滿的在主配置文件中配置了mybatis.configuration.use-actual-param-name=false
但是一運行發現還是依舊報錯,很奇怪.於是追蹤了org.apache.ibatis.session.Configuration的構造過程
發現springboot在啓動也確實將構造的Configuration的useActualParamName設置成了false,但是在
調用時上文中74行依舊是true爲什麼還是不生效呢?然後筆者又追蹤了mybati接口調用過程中的org.apache.ibatis.binding.MapperProxy,發現其中的configuration對象和之前那個configuration對象的
hashCode居然不一致,我恍然大悟原來是因爲xml中的configuration對象的useActualParamName依舊是
true,所以解決的方式就是在xml中配置上bean

    <!--spring boot 會根據properties文件創建一個configuration,和xml中定義的configuration是兩個對象
  所以properties中的 mybatis.configuration.use-actual-param-name對xml中的不會生效所以需要手動指定-->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dynamicDataSource"/>
      <property name="configuration" ref="conf"/>
  </bean>
  <bean id="conf" class="org.apache.ibatis.session.Configuration">
      <property name="useActualParamName" value="false"/><!--false是才能在高版本的mybatis中兼容舊代碼中的#{0}寫法-->
  </bean>

編譯,運行,調用ok,完美升級舊的項目,不改業務代碼完成遷移
後記
在帶個追蹤過程中,網上可參考的資料也沒什麼太大價值,主要還是通過debug源碼來分析追蹤,所以對
源碼體系的掌握對解決一些其他人沒有遇到過的問題是很有幫助了,如果不閱讀源碼這個問題是沒辦法找到解決的方案的

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