15

我目前正在开发一个在使用 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 而不是蓝图读取的,我该怎么做?

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

谢谢

4

2 回答 2

5

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

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

不要将 Spring、spring-data、JPA 和其他整体技术与 OSGi 一起使用作为

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

对此争论不休的人,已经花了很多时间寻找这样的解决方法。他们设法实现了一些业务逻辑。他们希望他们现在真正为每个概念问题找到了解决方法,并且他们下次不必花费相同的工作量。他们在进行竞价拍卖。诚实的家伙!在某个地方,你知道我是对的;-)。

我是根据我的经验这么说的

  • 尝试了基于 Hibernate 的完美堆栈,并且不要重复IBM 的 DAO 文章(早在 Spring-Data 炒作开始之前)。两次
  • 为 Hibernate 4.1.x编写了hibernate-osgi-adapter
  • 重新实现了 OSGi Enterprise 规范的完整 JPA 章节
于 2015-05-19T22:35:57.203 回答
4

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

于 2013-04-16T06:34:50.197 回答