2013-10-02 95 views
3

我正在使用多個模塊的基於Eclipse 3.7 RCP的應用程序。模塊A是一堆庫,包括mybatis-3.2.2.jar。模塊B依賴於模塊A(manifest.mf中的Require-Bundle),並具有使用MyBatis訪問數據庫中的數據的代碼。我已經在模塊B中導出了包含映射程序類和XML的包,並將它們導入到模塊A中。我在代碼中構建SqlSessionFactory,如果按名稱添加所有Mapper類,則工作正常。如何避免在OSGI環境中使用MyBatis加載類問題?

configuration.addMapper(MyMapper.class); 

但是當我嘗試添加所有映射器在包:

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

MyBatis不會自動看到它們。

我試着改變默認的類加載器,但這沒有幫助。

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

我懷疑這個問題與OSGI環境中類的可見性有關。如果是這樣的話,有什麼方法可以在應用程序中修復它?

+0

此外,您可能希望用mybatis提交錯誤,因爲它們使用ResolverUtil的方式甚至不允許您提供自己的類加載器,而無需重新編寫掃描代碼。至少它立即看起來如何。 –

+0

我發現這個鏈接,它很好地爲我工作http://techtwitch.blogspot.de/2012/06/boldly-go-where-no-sql-mapper-has-gone.html –

回答

2
+0

我得出了類似的結論。我可以看到ResolverUtil.find(Test test,String packageName)方法甚至不使用classloader字段,而是委託給VFS.list(path)。我想我必須編寫一個實現OSGI特定掃描邏輯的自定義VFS類。不值得爲我付出努力,我會一直添加我的Mapper類。 – Techie

+0

儘管您的鏈接可能會將用戶重定向到正確的答案,但您最好在這裏解釋它們,因爲隨着時間的推移,您永遠不知道鏈接是否仍然運行並且運行正常。謝謝。 @Sheena Artip – TheLuminor

2

我在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類,否則沒有多少事情可以做。

2

您試過

Resources.setDefaultClassLoader(Activator.class.getClassLoader())。我認爲這將使用OSGi類加載器的捆綁。希望這會有所幫助。

相關問題