- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个核心库,它有一个接口(interface),我想在 Fuse ESB(Apache ServiceMix 和 Karaf)中公开为 OSGI 服务。目标是允许其他包使用它。该服务使用 JPA (OpenJPA) 和 Spring。界面如下:
public interface PatientService {
public Patient find(Integer id);
}
和类(class):
@Repository
public class PatientServiceJpaImpl implements PatientService {
@PersistenceContext(unitName="psu")
private EntityManager entityManager;
@Override
public Patient find(Integer id) {
return entityManager.find(Patient.class, id);
}
}
以下是一个缩写的META-INF/spring/beans.xml
:
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<context:annotation-config />
<context:component-scan base-package="..." />
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="psu" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</bean>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
</beans>
和 META-INF/persistence.xml
(也缩写):
<persistence xmlns="http://java.sun.com/xml/ns/persistence" ...>
<persistence-unit name="psu" transaction-type="RESOURCE_LOCAL">
<class>...</class>
</persistence>
在非 OSGi 环境中,一切正常。它使用 felix maven-bundle-plugin,所以为了创建 OSGi 服务,我添加了以下 OSGI-INF/blueprint/osgi-context.xml
:
<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
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<bean id="patientService" class="com.test.service.PatientServiceJpaImpl" />
<service id="osgiPatientService" ref="patientService" interface="com.test.service.PatientService" />
</blueprint>
bundle部署成功,服务注册成功。问题是,当从另一个包引用 PatientService
时,实体管理器没有被注入(inject),因此在 find(Integer id)< 中抛出一个
方法。以下是消费者的 NullPointerException
/META-INF/spring/consumer-context.xml
的片段:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/osgi
http://www.springframework.org/schema/osgi/spring-osgi.xsd">
<bean id="patientServiceImpl" class="com.test.ws.PatientWebServiceImpl" >
<property name="patientService">
<osgi:reference interface="com.test.service.PatientService"/>
</property>
</bean>
...
</beans>
需要说明的是,PatientService
被注入(inject)到消费者包中,但实体管理器并未注入(inject)到提供者包中。此外,由于在启动原始服务时会输出以下日志,因此持久性单元似乎不是问题:
125 psu TRACE [SpringOsgiExtenderThread-14] openjpa.Runtime - org.apache.openjpa.persistence.PersistenceProviderImpl@24a5031d creating container org.apache.openjpa.persistence.EntityManagerFactoryImpl@4d6f77b6 for PU psu.
为了了解发生了什么,我在 PatientServiceJpaImpl
类的构造函数中记录了对象内存引用和堆栈跟踪。构造函数被调用两次(创建两个不同的对象):
第一个输出似乎源自 osgi 容器,从 org.apache.felix
开始,或多或少以 org.apache.aries.blueprint
结束.
第二个输出似乎源自 spring 框架,从 org.springframework.osgi
开始,或多或少以 org.springframework.beans.BeanUtils
结束.
调用消费者服务时,它所引用的是蓝图实例化对象,该对象没有注入(inject)实体管理器。同样从日志中可以看出,持久化单元是在 PatientServiceJpaImpl
对象的蓝图实例化之后实例化的。
我已经对这个问题进行了很长一段时间的搜索和修改,但我的想法已经用完了。具有讽刺意味的是,它实际上在某一时刻起作用,但我做了太多改变才能让它起作用,以至于它是一个我无法成功退出的老鼠窝。
为什么持久化上下文没有注入(inject)到蓝图管理对象中?任何想法将不胜感激。谢谢。
最佳答案
我不确定这是否可行,因为您将 spring 与蓝图混合在一起。我有一个仅基于蓝图的工作应用程序,我很高兴。对于您的用例,我建议至少为您的 JPA 部分使用蓝图。您仍然可以使用 spring-dm 将 jpa 类用作服务。
<blueprint default-activation="eager"
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0">
<bean id="patientService" class="com.test.service.PatientServiceJpaImpl" >
<jpa:context property="em" unitname="dn1" />
<tx:transaction method="*" value="Required" />
</bean>
<service id="osgiPatientService" ref="patientService" interface="com.test.service.PatientService" />
</blueprint>
您的 PatientServiceJPAImpl
我会更改为不包含任何注释。
public class PatientServiceJpaImpl implements PatientService {
protected EntityManager em;
@Override
public Patient find(Integer id) {
return em.find(Patient.class, id);
}
}
关于jpa - 未注入(inject) OSGI 服务 JPA PersistenceContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688492/
我当前在刷新 PersistenceContext 中的数据时遇到问题。我有一个 CMT EJB3 bean,它调用 BMT EJB3 bean。在 BMT bean 中,我对对象执行一些处理逻辑。我
据我了解,交易完成后不会立即刷新。它们位于内存中的缓存中,只有在 EntityManager 确定这样做具有成本效益时才会写入数据库。我相信在这种情况下使用了 L1 缓存,但如果我错了请纠正我。 我的
我创建了一个 PersonDao 对象,它是一个应该使用注入(inject)实体管理器的可注入(inject) bean。问题是 @PersistenceContext() 没有注入(inject)我
根据许多示例,可以像这样将 EntityManager 注入(inject) @Stateless 或 @Singleton EJB: @Stateless // or @Singleton publ
我已经使用多个实体管理器工厂和多个事务管理器定义了多个持久性单元。我知道我可以通过向持久性上下文提供单元名称来访问相应的实体管理器,如下所示。 @PersistenceContext(unitName
我尝试创建 BaseDao 并向其注入(inject) EntityManager。在 Spring 我做了这个: public abstract class BaseJpaDao implement
我正在使用 JPA 2.1,我有这样的东西 public class EntityManagerProducer { @Produces @PersistenceContext(uni
我将 JPA 用于我的应用程序的数据访问层。 我为每个表(实体)都有一个 DAO 类,在每个表中我都通过以下方式获得实体管理器@PersistenceContext 注释。但最近我读到,这意味着我的每
我想这个问题很简单。我不知道该怎么做,我唯一的猜测是: @PersistenceContext("Bibliothouris" + RunParallelized.thread) protected
我正在尝试使用 Delta Spike (@RunWith(CdiTestRunner.class)) 在单元测试中让 CDI(使用 Open Web Beans)工作。依赖注入(inject)工作正
这是我的java类: public class Finder { @PersistenceContext(unitName = "abc") EntityManager em; publi
EntityManager @Inject[ed] 在多个类中是否是线程安全的? @PersistenceContext(unitName="blah") private EntityManager
在几个项目中我已经成功使用 @PersistenceUnit(unitName = "MiddlewareJPA") EntityManagerFactory emf; ... EntityManag
我有两个不同的 EntityManager,我想在其相关 EntityManagerFactory 的遗留类(无 bean) 中使用 @PersistenceContext(name = "entit
基于这个例子: @Service public class Purchase { @PersistenceContext private EntityManager em; @Autowi
我正在使用 Wildfly 创建一个简单的 CRUD 应用程序来管理图书(查找和保留) 但是 EntityManager 总是返回 null。 我尝试了 Persistence.createEntit
我们正在使用 Spring 3.1、JPA(通过 Hibernate)和 Quartz。通常,我们通过 Service bean 上的 @PersistenceContext 注释以及 SpringM
我正在使用 Wildfly 10、Jersey,并使用 @Inject 注入(inject)依赖项。我有 DAO 和 Service 接口(interface),其实现在 CustomBinder 中
我想知道当我调用 session= session.getCurrentSession() 时,hibernate 何时完成上下文 session 问题是我的 dao 中有 2 个方法调用 getCu
尝试通过注释 PersistenceContext 访问 EntityManager 时出现 NullPointerException import javax.ejb.Stateless; impo
我是一名优秀的程序员,十分优秀!