2016-06-25 1 views
0

Beispiel aus der offiziellen Hibernate-Dokumentation.Karaf + JPA: Wie bekomme ich eine Instanz mit injected property mit blueprint.xml?

Können Sie mir einige Beispiele geben, wie Sie dieses DataPointServiceImpl mit bereits injiziertem EntityManager aus dem Container holen können?

UPDATE

habe ich versucht, diese

blueprint.xml

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 
<bean id="myActivator" class="ru.bia.karaf.web.Activator" init-method="test"> 
     <property name="entityManager" ref="entityManager"/> 
    </bean> 
    <reference id="entityManager" interface="javax.persistence.EntityManager"/> 
</blueprint> 

Activator.java

public class Activator implements BundleActivator { 
    EntityManager entityManager; 

    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    public void test(){ 
     System.out.println(entityManager); 
    } 
... 
    } 

aber ich habe jetzt

ERROR: Bundle org.apache.aries.jpa.support [204] EventDispatcher: Error during dispatch. (java.lang.ClassCastException: org.apache.aries.transaction.internal.AriesTransactionManagerImpl cannot be cast to javax.transaction.TransactionManager) java.lang.ClassCastException: org.apache.aries.transaction.internal.AriesTransactionManagerImpl cannot be cast to javax.transaction.TransactionManager

Antwort

2

Über OSGi-Dienste "holen" Sie nicht den Impl, den Sie "nur" den Dienstanbieter über seine API abrufen, was in Ihrem Fall der DataPointService ist.

Wenn das, was Sie wollen, dann ist es einfach:

<reference id="pointService" interface="org.hibernate.osgitest.DataPointService"/> 

Diese Sie auf den Dienst der Referenz geben. Wenn Sie lieber direkten Zugriff auf den EntityManager haben möchten, machen Sie dasselbe mit der Schnittstelle des EntityManagers.

etwas beim Start tun Sie das Init-Methode aufrufen müssen definieren, nachdem die Bohne vollständig initialisiert wurde:

<bean id="myConsumingBean" init-method="init"> 
    <property name="dataPointService" ref="pointService"> 
</bean> 

auch einen Blick here

UPDATE nehmen Vielleicht möchten:
Der angezeigte Fehler ist möglicherweise auf zwei verschiedene Schnittstellen zurückzuführen, die Ihrem System zur Verfügung stehen. Überprüfen Sie, welche Bundles diese Schnittstelle tatsächlich bereitstellen oder ob diese Schnittstelle in Ihrem eigenen Bundle enthalten ist.

Letzteres kann passieren, wenn Sie auf die javax.persistence.EntityManager Bereitstellung in Ihrem Maven-Projekt mit Scope kompilieren. Scope Compile (das ist der Standardwert, wenn nicht festgelegt) führt normalerweise dazu, dass diese Abhängigkeiten in Ihr eigenes Paket eingebettet werden. Stellen Sie sicher, dass Sie den Umfang angeben, der Ihr Problem beheben sollte.

UPDATE 2:
Bitte nicht ein Bündel Aktivator für diese verwenden, können Sie nicht Entwurf und Bündel Aktivatoren haben gemischt. Sie sollten eine Std. Verwenden. Java-Klasse dafür. Grundsätzlich verhält sich Blueprint wie ein Frühling und daher ist die blueprint.xml wie ein Bündelaktivator. Ursache, wenn Sie die beiden mischen, haben Sie das Ergebnis, dass Ihre Klasse nicht ordnungsgemäß erstellt wurde.

+0

Ich habe die ' ' aber in Activator onStart() bekomme ich stil null 'Servicereference dataPointServiceReference = bundleContext.getServiceReference (" pointService "); Servicereference entityManagerServiceReference = bundleContext.getServiceReference (" myEntityManager ");' –

+0

erf .. Sie können Blaupause und klassische OSGi Activators nicht mischen ... vielleicht sollten Sie Ihrer Frage noch weitere Details hinzufügen? –

+0

Ich muss auf die Datenbank zugreifen, indem ich Hibernate für Bundle starte –

Verwandte Themen