2013-10-02 3 views
3

Я работаю над приложением Eclipse 3.7 RCP с несколькими модулями. Модуль A представляет собой набор библиотек, включая mybatis-3.2.2.jar. Модуль B зависит от модуля A (Require-Bundle в манифесте.mf) и имеет код, который использует MyBatis для доступа к данным в базе данных. Я экспортировал пакеты с классами mapper и XML в модуль B и импортировал их в модуль A. Я создаю SqlSessionFactory в коде, и он отлично работает, если я добавляю все классы Mapper по имени, например.Как избежать проблем с загрузкой в ​​MyGatis в среде OSGI?

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

configuration.addMappers использует собственный 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

EDIT: Вот некоторые для 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

То же самое относится, однако.

+0

Я пришел к аналогичному выводу. Я вижу метод ResolverUtil.find (Test test, String packageName), даже не используя поле classloader, вместо этого делегируя VFS.list (путь). Я предполагаю, что мне придется написать собственный класс VFS, реализующий логику сканирования, специфичную для OSGI. Не стоит усилий для меня, я буду продолжать добавлять классы Mapper один за другим. – Techie

+0

Несмотря на то, что ваши ссылки, возможно, перенаправляют человека на правильный ответ, вам лучше объяснить их здесь, потому что со временем вы никогда не узнаете, что ссылки все еще работают и нет. Благодарю. @Sheena Artip – TheLuminor

2

У меня возникла аналогичная проблема с Spring Data JPA в среде Felix OSGi. В этом случае я был в состоянии переопределить класс фабрики и добавить в методы обижая:

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 ,

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

Надеемся, что методу addMappers не потребуется обращаться к загрузчику классов модуля А в тот же вызов. Если это так, то тонны вы не сможете сделать, если есть способ расширить и ввести другой класс Configuration или MapperRegistry.

2

Вы пробовали

Resources.setDefaultClassLoader(Activator.class.getClassLoader()). Я думаю, что будет использовать загрузчик класса OSGi для пакета. Надеюсь, это поможет.

Смежные вопросы