来自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
答案 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有点像捆绑激活器。
因为如果你混合两者,你将得到你的类没有正确创建的结果。