我有一个Web应用程序,我试图在JBOSS EAP 6 App Server中运行。我试图将EntityManagerFactory注入我的Singleton Bean。
@Singleton
@Startup
public class RestServerConfigurator {
private static RestServerConfigurator instance;
@PersistenceUnit(unitName = "clinicalTrialsEntityManager")
private EntityManagerFactory emf;
public RestServerConfigurator() {
if (emf == null) {
System.out.println("You're null.");
}
else {
System.out.println("Yay! Not null!");
}
}
在某种程度上,我知道正在评估PersistenceUnit注释。如果我尝试给它一个除了我的persistence.xml中提到的unitName以外的unitName,那么当我尝试部署应用程序时,JBOSS服务器会抱怨。
相关的persistence.xml结构。
<persistence-unit name="clinicalTrialsEntityManager" transaction-type="RESOURCE_LOCAL">
<jta-data-source>java:jboss/datasources/ClinicalTrialsDS</jta-data-source>
从各方面来看,似乎“emf”变量从未被初始化,即使它成功部署,只要尝试使用EntityManagerFactory,就会抛出空指针。
我甚至创建了一个Singleton StartUp Bean来初始化EntityManagerFactory,也许这就是我所缺少的东西,它会以某种方式将它们联系在一起,但无济于事。请告诉我我缺少的内容,或者是否需要更多信息。
此外,如果有人能够解释当使用注释/注入方法时,EntityManagerFactory如何“假定”在幕后进行初始化,那将是最受欢迎的。我对EJB概念很陌生,并且无法理解它。
10:00:10,348 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 135) JBAS011402: Starting Persistence Unit Service 'clinicalTrials.war#clinicalTrialsEntityManager'
10:00:10,348 INFO [org.hibernate.ejb.Ejb3Configuration] (ServerService Thread Pool -- 135) HHH000204: Processing PersistenceUnitInfo [
name: clinicalTrialsEntityManager
...]
10:00:10,371 INFO [org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator] (ServerService Thread Pool -- 135) HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
10:00:10,411 INFO [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 135) HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
记录输出以验证Bean已初始化:
13:53:36,132 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-10) JNDI bindings for session bean named RestServerConfigurator in deployment unit deployment "clinicalTrials.war" are as follows:
java:global/clinicalTrials/RestServerConfigurator!edu.emory.clinical.trials.webapp.server.rest.RestServerConfigurator
java:app/clinicalTrials/RestServerConfigurator!edu.emory.clinical.trials.webapp.server.rest.RestServerConfigurator
java:module/RestServerConfigurator!edu.emory.clinical.trials.webapp.server.rest.RestServerConfigurator
java:global/clinicalTrials/RestServerConfigurator
java:app/clinicalTrials/RestServerConfigurator
java:module/RestServerConfigurator
答案 0 :(得分:0)
我拔掉了Jersey实现并依赖JBoss的紧耦合RESTEasy模块,解决了依赖注入无法正常运行或按预期运行(特别是在我的Rest服务类中)的所有问题。
为了得出这个结论,我使用了他们的example apps(特别是helloworld-rs和hibernate4)并从那里进行逆向工程。
我找到了一个article关于扩展AbstractBinder并在我的应用程序中注册它,但它似乎更容易(并且需要更少的代码)我的目的是删除Jersey和我最初的所有手动“排除”RESTEasy配置在阅读this文章之后做了。
答案 1 :(得分:0)
通过EntityTransaction
API由应用程序控制其事务的实体管理器是资源本地实体管理器。通过持久性提供程序将resource-local
实体管理器事务映射到资源上的资源事务。资源本地实体管理器可以使用服务器或本地资源连接到数据库,并且不知道可能存在或可能不活动的JTA
事务。
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="ShopPU" transaction-type="RESOURCE_LOCAL">
...
</persistence-unit>
</persistence>
使用以下代码
创建EntityManager
引用
EntityManagerFactory emf = Persistence.createEntityManagerFactory("Order");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
...
em.getTransaction().commit();
em.close();
emf.close ();