2016-01-15 4 views
0

У меня есть веб-приложение, которое я пытаюсь запустить внутри сервера приложений JBOSS EAP 6. Я пытаюсь внедрить EntityManagerFactory в мой Singleton Bean.@PersistenceUnit EntityManagerFactory не получает инициализацию/все еще null

@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, сервер JBOSS будет жаловаться, когда я попытаюсь развернуть приложение.

Релевантный постоянство.xml структура.

<persistence-unit name="clinicalTrialsEntityManager" transaction-type="RESOURCE_LOCAL"> 
     <jta-data-source>java:jboss/datasources/ClinicalTrialsDS</jta-data-source> 

Судя по всему, она появляется «ЭДС» переменная никогда не инициализируется, и что даже если он развертывает успешно, нулевой указатель брошено всякий раз, когда 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

Спасибо за комментарий. Фактически, я вижу те детали, которые предполагают, что инициализация работает правильно. Я изменю вопрос с помощью операторов журналов, о которых я говорю. – daniel9x

+0

Как вы ссылаетесь на свою фабулу без гражданства, забыли добавить до этого, вы найдете детали боба [JNDI] в журналах, чтобы обеспечить в веб-приложении, bean инициализируется. Также вы можете попробовать создать его - 'EntityManagerFactory emf = Persistence.createEntityManagerFactory (UNIT_NAME); '. Кроме того, инжекторный завод в фазе без состояния не рекомендуется, вводить в singleton и затем извлекать из него диспетчер объектов. –

ответ

0

Все мои вопросы, связанные с инъекции зависимостей не функционирует должным образом или, как ожидалось (особенно в моих классах Rest службы) были решены, когда я отключил мой Джерси и использовал надежный модуль RESTEasy от JBoss.

Чтобы прийти к такому выводу, я использовал их example apps (в частности helloworld-rs и hibernate4) и обратный оттуда.

Я нашел article о расширении AbstractBinder и регистрации этого приложения с моим приложением, но мне просто казалось проще (и требуется меньше кода) для моих целей, чтобы удалить Джерси и всю ручную «исключить» конфигурацию RESTEasy, которую я изначально сделал после прочтения this статья.

0

Администратор сущности, чьи транзакции контролируются приложением через API EntityTransaction, является локальным менеджером объектов. A 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(); 
Смежные вопросы