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

2

你有没有尝试过

Resources.setDefaultClassLoader(Activator.class.getClassLoader()). 我认为这将使用捆绑包的 OSGi 类加载器。希望这会有所帮助。

于 2015-09-30T16:34:34.327 回答
1

configuration.addMappers 使用它自己的 ResolverUtil,它使用 Thread 上下文类加载器。(至少在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 回答