是否可以将OSGi与Spring Data集成?

时间:2013-04-15 15:12:53

标签: spring osgi spring-data

我目前正在开发一个在使用JPA和QueryDSL的apache Karaf下运行的OSGi应用程序。

我想知道我是否可以将Spring Data与QueryDSL一起使用而不是当前的方法。

这样做的原因是我发现Spring存储库非常有用,并且拥有NoSQL数据库访问模板将来可能会有用。

我尝试在没有OSGi的Web上下文的情况下启动普通的spring应用程序,但是当它尝试加载applicationContext.xml或ApplicationContext.class时,我得到了一个ClassNoutFoundException。

我不想使用Spring DM,因为它已经停止使用。

基本上,想要尝试这种集成的唯一原因是Spring Repositories,但如果您认为没有必要,请告诉我。有关如何实现这一目标的任何信息,或者是否可以继续这样做,将非常受欢迎。

谢谢

更新

我已经设法通过使用org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext启动应用程序上下文来开始工作。 applicationContext作为服务在OSGi中导出,我可以通过调用它来获取所需的所有bean。

我现在遇到的问题是,当我声明<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。 entityManagerFactory是一个我可以使用蓝图获得的服务。我想我需要在<jpa:repositories base-package="x.y.z" />中引用它,但是我该怎么做呢,因为applicationContext.xml被spring读取而不是蓝图?

我真的很感激任何正确方向的提示。

谢谢

2 个答案:

答案 0 :(得分:5)

直接在您的代码中使用Querydsl-SQL和

  • 它在OSGi中运行良好,因为它不使用类加载,编织,增强,缓存和其他听起来非常好但导致混乱的技巧
  • 您的代码运行速度比使用任何“缓存增强型”JPA引擎
  • 快得多
  • 其他人将能够理解您的代码(而不是JPA Criteria API查询)
  • 您将确切知道在数据库服务器上运行哪些SQL命令以最大限度地缩短解决问题的时间
  • 您的代码将与任何ORM工具一样独立于数据库

不要将Spring,spring-data,JPA和其他单一技术与OSGi一起使用

  • 它们被设计为在单一系统中工作,其中所有内容都在一个应用程序环境中,而不是在单独的包中
  • 通过将这些技术与OSGi结合使用,您将花费大部分时间来修复此类错误并寻找解决方法

与此争论的人,已经花了很多时间寻找这样的解决方法。他们设法实现了一些业务逻辑。他们希望他们现在真正找到每个概念问题的解决方法,他们下次不必花费相同的工作量。他们在bidding fee auction。老实说!在某个地方,你知道我是对的; - )。

我用我的经验说这个。

答案 1 :(得分:4)

你有几个选择,尝试让它运行蓝图(可能是最难的 - 因为你需要调用spring bean,但我认为仍然可以完成),使用Karaf 3.0.0.RC1它还支持Blueprint Geminin,它对Spring有更严格的支持,但最后但并非最不重要的是使用Spring-DM,即使它已经停止使用,你也可以使用并且可能最好的方法是将spring-dm用于某些Spring特定部分和std 。其余的蓝图。因为你只是通过两个框架使用服务,所以一切都会工作,只是不要将spring和blueprint描述符混合在一个bundle中。