Karaf + JPA:如何使用blueprint.xml获取带有注入属性的实例?

时间:2016-06-25 14:19:57

标签: hibernate jpa osgi apache-karaf blueprint

来自hibernate官方文档的示例。

 <bean id="dpService" class="org.hibernate.osgitest.DataPointServiceImpl">
    <jpa:context unitname="data-point" property="entityManager"/>
    <tx:transaction method="*" value="Required"/>
  </bean>
  <service ref="dpService" interface="org.hibernate.osgitest.DataPointService"/>

您能否举例说明如何从容器中注入EntityManager来获取此DataPointServiceImpl?

更新

我试过这个

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);
    }
...
    }

但现在我得到了

  

错误:Bundle org.apache.aries.jpa.support [204] EventDispatcher:调度期间出错。 (java.lang.ClassCastException:org.apache.aries.transaction.internal.AriesTransactionManagerImpl无法强制转换为javax.transaction.TransactionManager)   java.lang.ClassCastException:org.apache.aries.transaction.internal.AriesTransactionManagerImpl无法强制转换为javax.transaction.TransactionManager

1 个答案:

答案 0 :(得分:2)

通过OSGi服务,您不会“获取”Impl,您只能通过其API(在您的情况下是DataPointService)检索服务提供商。

如果那就是你想要的,那就是直截了当:

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

这将为您提供服务的参考。如果您希望直接访问entitymanager,请使用entitymanager接口执行相同操作。

要在启动时执行某些操作,您需要在bean完全初始化后定义要调用的init方法:

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

可能还想看看here

<强>更新
您看到的错误可能是系统可用的两个不同接口的结果。检查实际提供此接口的捆绑包,或者此接口是否位于您自己的捆绑包内。

如果您依赖于使用范围编译在maven项目中提供的 javax.persistence.EntityManager ,则可能会发生后者。范围编译(默认情况下,如果未设置)通常会导致将这些依赖项嵌入到您自己的包中。确保将其设置为提供的范围,这应该可以解决您的问题。

更新2:
请不要使用捆绑激活器,不能将蓝图和捆绑激活剂混合使用。 你应该使用标准。这个Java类。基本上蓝图的行为与spring类似,因此blueprint.xml有点像捆绑激活器。 因为如果你混合两者,你将得到你的类没有正确创建的结果。