2013-04-15 17 views
14

Attualmente sto lavorando a un'applicazione OSGi in esecuzione con apache Karaf che utilizza JPA e QueryDSL.È possibile integrare OSGi con Spring Data?

Mi chiedevo se potevo usare Spring Data con QueryDSL invece dell'approccio corrente.

La ragione di ciò è che trovo gli archivi di Spring molto utili e avere un modello per gli accessi al database NoSQL potrebbe essere utile in futuro.

Ho provato ad avviare una normale applicazione di primavera senza un contesto Web con OSGi ma ottengo una classe ClassNoutFoundException quando tenta di caricare applicationContext.xml o ApplicationContext.class.

Non voglio utilizzare Spring DM da quando è stato interrotto.

Fondamentalmente l'unica ragione per voler provare questa integrazione è per i repository primaverili, ma se pensi che questo non sia necessario per favore dimmelo. Qualsiasi informazione su come ottenere questo o se è ok a perseverare sarebbe più che benvenuta.

Grazie

Aggiornamento

sono riuscito a far funzionare la primavera avviando il contesto dell'applicazione con org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext. ApplicationContext viene esportato in OSGi come servizio e posso richiamare tutti i bean necessari.

Il problema che sto avendo in questo momento è che, quando dichiaro <jpa:repositories base-package="x.y.z" /> ottengo la seguente eccezione:

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] 

Come fornitore JPA sto usando OpenJPA. L'entityManagerFactory è un servizio che posso ottenere usando il blueprint. Penso che ho bisogno di fare riferimento a <jpa:repositories base-package="x.y.z" />, ma come faccio a farlo dal momento che applicationContext.xml viene letto da primavera e non il progetto?

Gradirei davvero ogni suggerimento nella giusta direzione.

Grazie

risposta

4

Beh avete un paio di scelte qui, cercare di farlo funzionare con progetto (probabilmente la più difficile - dal momento che è necessario chiamare i fagioli di primavera, ma penso che potrebbe ancora essere fatto), l'uso Karaf 3.0.0.RC1 supporta anche Blueprint Geminin che ha un supporto più stretto per Spring e, ultimo ma non meno importante, usa Spring-DM, anche se è fuori produzione sei in grado di usare e probabile l'approccio migliore è usare spring-dm per alcune parti specifiche della molla e std. Cianografia per il resto. Poiché utilizzi semplicemente i servizi attraverso entrambi i framework, tutto funzionerà, basta non mescolare i descrittori di molla e di progetto in un unico pacchetto.

+0

primavera DM non è interrotto. È stato rinominato in "Gemini Blueprint". –

+0

Ma ora è un progetto che è leggermente diverso dalla sintassi spring-dm, quindi si potrebbe chiamarlo "discontinued". Lo uso ancora per determinati scenari ... :) –

+0

Grazie Achim Nierbeck. Grazie alla tua risposta, ho trovato quella classe Spring DM che ha fatto lavorare Spring. Ho anche aggiornato la mia risposta. Se sai qualcosa sull'integrazione di Apache Karaf con Spring Data, lo apprezzerei molto. Grazie ancora :) – Marius

3

Usa Querydsl-SQL direttamente nel codice e

  • che funzionerà bene all'interno OSGi in quanto non fa uso di caricamento delle classi, la tessitura, la valorizzazione, il caching e altri trucchi che suonano veramente bene, ma provoca il caos
  • il codice verrà eseguito molto più velocemente che con qualsiasi dei motori di APP "cache-enhanced"
  • altri saranno in grado di capire il codice (non come JPA query Criteri API)
  • si sa esattamente che cosa comandi SQL eseguito su il server database che riduce al minimo il problema tempo -solving
  • vostro codice sarà come base di dati indipendenti come con qualsiasi strumento ORM

Non usare Spring, primavera-data, APP e altre tecnologie monoholitic insieme con OSGi come

  • erano progettato per funzionare all'interno di sistemi monoolitari in cui tutto è in un contesto applicativo, non in bundle separati
  • utilizzando queste tecnologie insieme a OSGi trascorrerai la maggior parte del tuo tempo a correggere bug come questo e cercando soluzioni alternative

Le persone che discutono su questo argomento hanno già dedicato molto tempo alla ricerca di soluzioni alternative. Sono riusciti a implementare alcune logiche di business. Sperano che ora abbiano davvero trovato soluzioni alternative per ogni problema concettuale e che non debbano spendere la stessa quantità di lavoro la prossima volta. Sono in un bidding fee auction. Sii onesto ragazzi! Da qualche parte in profondità sai che ho ragione ;-).

Lo dico con l'esperienza che ho

  • provato la pila perfetta base di Hibernate e Don't repeat the DAO articolo del IBM (molto prima che iniziasse campagna pubblicitaria primavera-Data). Due volte
  • scritto hibernate-osgi-adapter per Hibernate 4.1.x
  • Re-implemented la completa capitolo JPA delle specifiche OSGi Enterprise
+1

P.s .: Non ho scritto questa risposta per la taglia. Ho scritto questo per mettere il bug nelle orecchie degli sviluppatori che hanno utilizzato stack ORM perfetti che integri ogni livello, eppure trascorrono il 50% del loro tempo cercando soluzioni alternative. –

+0

Questo in realtà non risponde alla mia domanda. Non sono ancora molto convinto, anche se conosco profondamente :), che probabilmente hai ragione;). Ma questo è abbastanza chiaro per permettermi di assegnarti la taglia. –