1.問題の背景
プロジェクトはmybatisとTkmybatisのアーキテクチャを使用しており、これら2つのアーキテクチャは別々に使用できますが、プロジェクトの残りの記述は悲痛です。この状況を考慮して、ホストはTKmybatisのアーキテクチャを採用することを決定しました。
TkMybatisのマッパーと関連パッケージは次のとおりです。
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
コード:
import tk.mybatis.mapper.common.Mapper;
public interface SysUserMapper extends Mapper<SysUser> {
}
注を追加:import tk.mybatis.spring.annotation.MapperScan: @MapperScan( "cn.com.web.mapper")
パーツ開始エラーメッセージ:
1、org.springframework.beans.factory.UnsatisfiedDependencyException:「authController」という名前のBeanの作成中にエラーが発生しました:フィールド「systemService」で表現された依存関係が満たされていません。ネストされた例外はorg.springframework.beans.factory.UnsatisfiedDependencyExceptionです:「systemService」という名前のBeanの作成中にエラーが発生しました:フィールド「sysUserMapper」で表現された不満足な依存関係。ネストされた例外はorg.springframework.beans.factory.UnsatisfiedDependencyExceptionです:ファイル[E:\ gitWorkSpace \ bm-wechat-ling-framework \ bm-wechat-ling-admin \ target \ classes \で定義された「sysUserMapper」という名前のBeanの作成中にエラーが発生しましたcn \ com \ bluemoon \ admin \ web \ mapper \ SysUserMapper.class]:Beanプロパティで表現された満たされていない依存関係 '; ネストされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:クラスパスリソース[cn / com / bluemoon / mybatis / datasource / DataSourceConfig.class]で定義された「dynamicSqlSessionFactory」という名前のBeanの作成中にエラーが発生しました:ファクトリメソッドによるBeanのインスタンス化に失敗しました。ネストされた例外はorg.springframework.beans.BeanInstantiationExceptionです:[org.apache.ibatis.session.SqlSessionFactory]のインスタンス化に失敗しました:ファクトリメソッド ' dynamicSqlSessionFactory 'が例外をスローしました。ネストされた例外はcn.com.bluemoon.mybatis.Exception.WebExceptionです
2、原因:org.springframework.beans.factory.BeanCreationException:クラスパスリソース[cn / com / bluemoon / mybatis / datasource / DataSourceConfig .class]で定義された「dynamicSqlSessionFactory」という名前のBeanの作成中にエラーが発生しました:ファクトリメソッドによるBeanのインスタンス化に失敗しました; ネストされた例外はorg.springframework.beans.BeanInstantiationExceptionです:[org.apache.ibatis.session.SqlSessionFactory]のインスタンス化に失敗しました:ファクトリメソッド 'dynamicSqlSessionFactory'が例外をスローしました。ネストされた例外はcn.com.bluemoon.mybatis.Exception.WebExceptionです
二、解決策
1.エラーが表示され、Beanの初期化プロセスだと思ったので、以下に基づいています。Beanプロパティ「sqlSessionFactory」で表現された不満足な依存関係オンラインで答えを見つけ、次のような記事を 見つけました:https://blog.csdn.net / sinat_34104446 / article / details / 83473712
主に以下の点について:
1)、構成ファイル:、
mybatis.mapper-locations = classpath*:mapper/*.xml
mybatis.config-location = classpath:mybatis-config.xml
classpath *:mapper / *。xmlとclasspath:mapper/*。xmlの違い
classpath:クラスパス内のファイルのみを検索します
。classpath*:クラスパスを含めるだけでなく、検索用のjarファイル(クラスパス)も含めます。
2)マッパーのインターフェースパスが* .xmlファイルと一致するかどうか。
3)起動時に追加されたアノテーションが他のパッケージを導入していないかどうか:@MapperScan({"cn.com.web.mapper"、 "cn.com.admin.mapper"})
2.手順1に従って再度確認し、すべてが要件を満たしていることを確認したため、次のヒントに従ってデバッグすることにしました。
クラスパスリソース[cn / com / bluemoon / mybatis / datasource / DataSourceConfig.class ]で定義された 「dynamicSqlSessionFactory」という名前のBeanの作成中にエラーが発生しました
以下に示すように、DataSourceConfigの dynamicSqlSessionFactoryメソッドを見つけ ます。
実行が矢印に達すると、エラーが報告されるため、デバッグはこのメソッドに入り、他の実行プロセスはここでは無視されます。最後に、SqlSessionFactoryBeanのbuildSqlSessionFactory()メソッドを入力します。
以下に示すように:
上図の異常部分に示すように、コピー値の値は次のとおりです。
java.lang.IllegalArgumentException:マップされたステートメントコレクションには、 cn.com.bluemoon.admin.web.mapper.SysMenuMapperの値がすでに含まれています。挿入します。
ファイル[E:\ gitWorkSpace \ bm-wechat-ling-framework \ bm-wechat-ling-admin \ target \ classes \ mapper \ SysMenuMapper.xml]と
cn / com / bluemoon / admin / web / mapper / SysMenuMapperを確認してください。 java(最良の推測)
上記のヒントによると、エラーは基本的に特定されています。挿入メソッドはマッパーインターフェイスに既に存在し、現在のSysMenuMapperインターフェイスにも挿入メソッドがあります。
ソリューション戦略:tk.mybatisのアーキテクチャに基づいて、追加、削除、変更、およびチェックのメソッドが実装され、以前の挿入メソッドが削除されました。これは完璧なソリューションです。
理由:マッパーインターフェイスのメソッドは次のとおりです:cn.com.bluemoon.admin.web.mapper.SysMenuMapper.insert、これはxmlファイルにマップされます:(namespace + select、update、delete、insert id)結合されたidは一意である必要があります。ここで、xmlには2つの挿入メソッドがあります。1つはxmlファイルの挿入メソッドであり、もう1つはtkmybatisによってカプセル化された挿入メソッドであり、xmlの挿入メソッドを削除します。
三、経験
1.他のプロジェクトがtk.mybatisを使用しており、メンテナンスの便宜のために調整が行われているため、テクノロジースタックを統合する傾向があるという考え。意外なことに、私が遭遇した穴は、調査するのに何時間もかかりました。。。
2.トラブルが発生しても慌てず、心を落ち着かせましょう。オンラインチュートリアルでは、問題のトラブルシューティング、特定の問題の詳細な分析、デバッグモードのオン、例外をスローするノードの検索、ノードの特定の例外情報に基づいた地雷の除去を行う方法のみを提供します。 。勝利は私たちの目の前にあります。