4

複数のモジュールを備えた Eclipse 3.7 RCP ベースのアプリケーションに取り組んでいます。モジュール A は、mybatis-3.2.2.jar を含む一連のライブラリです。モジュール B はモジュール A (manifest.mf の Require-Bundle) に依存しており、MyBatis を使用してデータベース内のデータにアクセスするコードがあります。モジュール B にマッパー クラスと XML を含むパッケージをエクスポートし、モジュール A にインポートしました。コードで SqlSessionFactory を構築していますが、すべてのマッパー クラスを名前で追加すると正常に動作します。

configuration.addMapper(MyMapper.class);

ただし、パッケージ内のすべてのマッパーを追加しようとすると:

configuration.addMappers(MyMapper.class.getPackage().getName());

MyBatis はそれらを認識しません。

デフォルトのクラスローダーを変更しようとしましたが、これは役に立ちませんでした。

Resources.setDefaultClassLoader(this.getClass().getClassLoader());

この問題は、OSGI 環境でのクラスの可視性に関係していると思われます。その場合、アプリケーションで修正する方法はありますか?

4

3 に答える 3

1

configuration.addMappers は、Thread コンテキスト クラス ローダーを使用する独自の ResolverUtil を使用します。(少なくとも mybatis3 では)。

最善の策は、独自のスキャン コードを作成し、addMapper を直接使用することです。以下に私の参考文献と例を示します。

http://grepcode.com/file/repo1.maven.org/maven2/org.mybatis/mybatis/3.1.1/org/apache/ibatis/session/Configuration.java?av=f#518

http://grepcode.com/file/repo1.maven.org/maven2/org.mybatis/mybatis/3.1.1/org/apache/ibatis/io/ResolverUtil.java#148

編集:ここにmybatis 3.2.2のいくつかがあります

http://grepcode.com/file/repo1.maven.org/maven2/org.mybatis/mybatis/3.2.2/org/apache/ibatis/io/ResolverUtil.java#147

http://grepcode.com/file/repo1.maven.org/maven2/org.mybatis/mybatis/3.2.2/org/apache/ibatis/binding/MapperRegistry.java#86

ただし、同じことが当てはまります。

于 2013-10-02T16:33:36.083 に答える
1

Felix OSGi 環境の Spring Data JPA で同様の問題に遭遇しました。その場合、ファクトリ クラスをオーバーライドして、これを問題のあるメソッドに追加することができました。

ClassLoader pre = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(context.getClassLoader());
    // add mappers here or call super method
} finally {
    Thread.currentThread().setContextClassLoader(pre);
}

この場合、「コンテキスト」は Spring コンテキストでしたが、BundleWiring からモジュール B のクラスローダーを取得できるはずです。

Bundle bundle; //get this by symbolic name if you don't have a reference
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
bundleWiring.getClassLoader();

addMappers メソッドが同じ呼び出しでモジュール A のクラスローダーにアクセスする必要がないことを願っています。その場合、別の Configuration または MapperRegistry クラスを拡張して注入する方法がない限り、できることは多くありません。

于 2015-09-28T22:14:47.353 に答える