2013-04-15 11 views
14

Ich arbeite gerade an einer OSGi-Anwendung unter Apache Karaf, die JPA und QueryDSL verwendet.Ist es möglich, OSGi mit Spring Data zu integrieren?

Ich frage mich, ob ich Spring Data mit QueryDSL anstelle der aktuellen Ansatz verwenden könnte.

Der Grund dafür ist, dass Spring-Repositories sehr nützlich sind und eine Vorlage für NoSQL-Datenbankzugriffe in der Zukunft nützlich sein könnte.

Ich habe versucht, eine normale Feder-Anwendung ohne einen Webkontext mit OSGi zu starten, aber ich bekomme eine ClassNoutFoundException, wenn es versucht, die applicationContext.xml oder die ApplicationContext.class zu laden.

Ich möchte nicht Spring DM verwenden, da es eingestellt wird.

Grundsätzlich ist der einzige Grund, diese Integration ausprobieren zu wollen, die Spring Repositories, aber wenn Sie das nicht für nötig halten, sagen Sie es mir bitte. Jede Information darüber, wie dies zu erreichen ist oder ob es in Ordnung ist, dies zu tun, wäre mehr als willkommen.

Danke

aktualisieren

Ich habe es geschafft, mit org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext durch Starten des Anwendungskontext Federarbeit zu machen. Der ApplicationContext wird in OSGi als Dienst exportiert und ich kann alle benötigten Beans abrufen.

Das Problem, das ich jetzt habe, ist, dass, wenn ich <jpa:repositories base-package="x.y.z" /> erkläre ich die folgende Ausnahme erhalten:

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] 

Als JPA-Provider ich OpenJPA bin mit. Die EntityManagerFactory ist ein Service, den ich mit dem Blueprint bekommen kann. Ich denke, ich muss es in <jpa:repositories base-package="x.y.z" /> verweisen, aber wie mache ich das, da die ApplicationContext.xml von Frühling gelesen wird und nicht die Blaupause?

Ich würde wirklich jeden Hinweis in die richtige Richtung schätzen.

Danke

Antwort

4

Well Sie ein paar Möglichkeiten haben hier, versuchen Sie es mit Plan (wahrscheinlich das härteste - da Sie Frühjahr Bohnen anrufen müssen, aber ich denke immer noch getan werden könnte) laufen zu bekommen, verwenden Karaf 3.0.0.RC1 unterstützt auch Blueprint Geminin, die eine engere Unterstützung für Spring und nicht zuletzt Spring-DM haben, auch wenn es nicht mehr funktioniert und wahrscheinlich ist der beste Weg, Spring-DM zu verwenden für bestimmte springspezifische Teile und Std. Blaupause für den Rest. Da Sie nur Dienste über beide Frameworks verwenden, wird alles funktionieren. Mischen Sie die Spring- und Blueprint-Deskriptoren nicht in einem Bündel.

+0

Frühling DM nicht unterbrochen wird. Es wurde in "Gemini Blueprint" umbenannt. –

+0

Aber jetzt ist es Blaupause, die etwas anders ist als die Feder-dm-Syntax, so könnte man es "unterbrochen" nennen. Ich benutze es immer noch für bestimmte Szenarien ... :) –

+0

Danke Achim Nierbeck. Wegen Ihrer Antwort habe ich festgestellt, dass die Frühlings-DM-Klasse Spring gemacht hat. Ich habe auch meine Antwort aktualisiert. Wenn Sie etwas über die Integration von Apache Karaf mit Spring Data wissen, würde ich es sehr schätzen. Nochmals vielen Dank :) – Marius

3

Verwenden Querydsl-SQL direkt im Code und

  • wird es auch in OSGi arbeiten, da es nicht das Laden von Klassen nicht verwendet, Weben, Verbesserung, Caching und andere Tricks, die wirklich gut klingen, aber verursachen Chaos
  • Ihr Code viel schneller als mit einem der „Cache-enhanced“ JPA Motoren
  • andere in der Lage, führen Sie den Code zu verstehen (nicht JPA Criteria API-Abfragen mögen)
  • Sie wissen genau, was SQL auf Befehle ausführen der Datenbankserver, der das Problem minimiert -solving Zeit
  • Code als Datenbank wird unabhängig wie bei jedem ORM-Tool

Verwenden Frühling nicht, feder Daten, JPA und andere monoholitic Technologien zusammen mit OSGi als

  • sie waren entworfen innerhalb monoholitic Systeme zu arbeiten, wo alles in einem Anwendungskontext ist, nicht in getrennten Bündeln
  • durch diese Technologien zusammen mit OSGi verwendet werden Sie die meiste Zeit verbringen Fehler wie diese zu beheben und der Suche nach Abhilfen

Leute, die damit streiten, haben bereits viel Zeit darauf verwendet, solche Problemumgehungen zu finden. Sie haben es geschafft, eine Geschäftslogik zu implementieren. Sie hoffen, dass sie nun wirklich eine Lösung für jedes konzeptionelle Problem gefunden haben und dass sie beim nächsten Mal nicht die gleiche Menge an Arbeit aufbringen müssen. Sie sind in einer bidding fee auction. Seid ehrlich Jungs! Irgendwo in der Tiefe weißt du, dass ich recht habe ;-).

Ich sage dies mit der Erfahrung, die ich

+1

P. .: Ich habe diese Antwort nicht für Kopfgeld geschrieben. Ich schrieb dies, um den Bug in die Ohren von Entwicklern zu bringen, die einen perfekten ORM-basierten Stack verwenden, der jede Ebene integriert, aber sie verbringen 50% ihrer Zeit damit, nach Workarounds zu suchen. –

+0

Das beantwortet meine Frage nicht wirklich. Ich bin immer noch nicht wirklich überzeugt, auch wenn ich es genau weiß :), dass du wahrscheinlich recht hast;). Aber das ist klar genug, um mir zu erlauben, Ihnen das Kopfgeld zu verleihen. –

Verwandte Themen