Можно ли интегрировать OSGi с Spring Data? - программирование
Подтвердить что ты не робот

Можно ли интегрировать OSGi с Spring Data?

В настоящее время я работаю над приложением OSGi под Apache Karaf, которое использует JPA и QueryDSL.

Мне было интересно, могу ли я использовать Spring Data с QueryDSL вместо текущего подхода.

Причиной этого является то, что я нахожу, что хранилища Spring весьма полезны, и в будущем может быть полезен шаблон для доступа к базам данных NoSQL.

Я попытался запустить обычное приложение Spring без веб-контекста с OSGi, но я получаю исключение ClassNoutFoundException, когда он пытается загрузить applicationContext.xml или ApplicationContext.class.

Я не хочу использовать Spring DM, так как он прекращен.

В принципе единственная причина желания попробовать эту интеграцию для репозиториев Spring, но если вы считаете, что это не обязательно, скажите мне. Любая информация о том, как добиться этого или если это одобряется, будет более чем приветствуем.

Спасибо

Обновление

Мне удалось сделать работу Spring, запустив контекст приложения с помощью org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext. ПриложениеContext экспортируется в OSGi в качестве службы, и я могу получить все beans, которые мне нужны, позвонив ему.

Проблема, с которой я столкнулась сейчас, заключается в том, что когда я объявляю <jpa:repositories base-package="x.y.z" />, я получаю следующее исключение:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in URL [bundle://251.13:0/META-INF/spring/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1109)[187:org.springframework.context:3.1.4.RELEASE]
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.registerBeanPostProcessors(AbstractDelegatedExecutionApplicationContext.java:502)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE]
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.registerBeanPostProcessors(AbstractDelegatedExecutionApplicationContext.java:451)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE]
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:306)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE]
    at org.eclipse.gemini.blueprint.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE]
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:290)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE]
    at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:137)[194:org.eclipse.gemini.blueprint.extender:1.0.0.RELEASE]
    at java.lang.Thread.run(Thread.java:662)[:1.6.0_37]
Caused by: java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation.
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:142)[195:org.springframework.transaction:3.1.4.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79)[195:org.springframework.transaction:3.1.4.RELEASE]
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70)[195:org.springframework.transaction:3.1.4.RELEASE]
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:103)[195:org.springframework.transaction:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1475)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1443)[185:org.springframework.beans:3.1.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)[185:org.springframework.beans:3.1.4.RELEASE]

Как поставщик JPA, я использую OpenJPA. СущностьManagerFactory - это сервис, который я могу получить, используя план. Я думаю, мне нужно ссылаться на него в <jpa:repositories base-package="x.y.z" />, но как это сделать, поскольку applicationContext.xml читается Spring, а не план?

Я бы очень признателен за намек в правильном направлении.

Спасибо

4b9b3361

Ответ 1

У вас здесь есть несколько вариантов, попробуйте запустить его с планом (возможно, самым сложным - так как вам нужно позвонить spring beans, но, я думаю, все еще можно сделать), используйте Karaf 3.0. 0.RC1 также поддерживает Blueprint Geminin, который имеет более жесткую поддержку spring и, наконец, не в последнюю очередь использует Spring -DM, даже если он прекращен, вы можете использовать и, вероятно, лучший подход - использовать Spring -dm для определенных spring конкретных частей и std. Концепция для остальных. Поскольку вы просто используете службы через оба фреймворка, все будет работать, просто не смешивайте дескрипторы spring и чертежа в одном комплекте.

Ответ 2

Используйте Querydsl-SQL непосредственно в вашем коде и

  • он будет хорошо работать в OSGi, поскольку он не использует загрузку классов, плетение, улучшение, кеширование и другие трюки, которые звучат очень хорошо, но вызывает хаос.
  • ваш код будет работать намного быстрее, чем с любым из механизмов JPA с улучшенным кешем
  • другие смогут понять ваш код (а не как запросы API-запросов JPA)
  • вы точно знаете, какие команды SQL выполняются на сервере базы данных, что минимизирует время решения проблем
  • ваш код будет как независимый от базы данных, как с любым инструментом ORM

Не используйте Spring, spring -data, JPA и другие моноголитные технологии вместе с OSGi как

  • они были разработаны для работы в моноголитных системах, где все находится в одном контексте приложения, а не в отдельных пакетах
  • используя эти технологии вместе с OSGi, вы потратите большую часть своего времени на исправление ошибок, подобных этому, и поиска обходных решений

Люди, которые спорят с этим, уже потратили много времени на поиск таких обходных решений. Им удалось реализовать некоторую бизнес-логику. Они надеются, что теперь они действительно нашли обходные пути для каждой концептуальной проблемы, и в следующий раз им не придется тратить столько же труда. Они находятся на аукционе аукционе по торгам. Будьте честными парнями! Где-то глубоко вы знаете, что я прав, -).

Я говорю это с опытом, что I