2016-09-05 5 views
4

Я пытаюсь ввести EntityManagerFactory с помощью @PersistenceUnit, но он всегда равен нулю.Inject EntityManagerFactory с помощью @PersistenceUnit на Джерси с Wildfly

Я думаю, что мой persistence.xml в порядке, так как я могу получить EntityManager с этим кодом:

EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager(); 

Итак, я хотел бы знать, если я делаю что-то неправильно, или если это не возможно при использовании Джерси (2.23) и Wildfly 10 (JBoss EAP 7).

Вот что я сделал до сих пор:

  • Создано Maven проект джерси-Quickstart-WebAPP на затмение;
  • Добавлены следующие зависимости для моей pom.xml:

    <dependency> 
        <groupId>javax</groupId> 
        <artifactId>javaee-api</artifactId> 
        <version>7.0</version> 
    </dependency> 
    <dependency> 
        <groupId>org.hibernate.javax.persistence</groupId> 
        <artifactId>hibernate-jpa-2.1-api</artifactId> 
        <version>1.0.0.Final</version> 
    </dependency> 
    <dependency> 
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-entitymanager</artifactId> 
        <version>5.2.2.Final</version> 
    </dependency> 
    <dependency> 
        <groupId>com.hynnet</groupId> 
        <artifactId>oracle-driver-ojdbc6</artifactId> 
        <version>12.1.0.1</version> 
    </dependency> 
    
  • создавшего persistence.xml:

    <persistence-unit name="myPersistenceUnit" 
        transaction-type="RESOURCE_LOCAL"> 
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
        <!-- All persistence classes must be listed --> 
        <class>com.mps.classes.TermosPesquisados</class> 
        <properties> 
        <!-- Provider-specific connection properties --> 
        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" /> 
        <property name="javax.persistence.jdbc.url" value="JDBC_URL" /> 
        <property name="javax.persistence.jdbc.user" value="USER" /> 
        <property name="javax.persistence.jdbc.password" value="PASSWORD" /> 
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
        <property name="hibernate.show_sql" value="false" /> 
        <property name="hibernate.connection.release_mode" value="after_transaction" /> 
        <property name="hibernate.connection.isolation" value="2" /> 
        </properties> 
    </persistence-unit> 
    
  • Измененный MyResource.java:

    @ManagedBean 
    @Path("myresource") 
    public class MyResource { 
    
        @PersistenceUnit(unitName= "myPersistenceUnit") 
        private EntityManagerFactory emf; 
    
        @GET 
        @Produces(MediaType.TEXT_PLAIN) 
        public String getIt() { 
        if(emf == null) 
         return "emf is null"; 
        return "emf is not null"; 
        } 
    } 
    
  • Добавлен пустой beans.xml (не уверен, что это необходимо);

+0

Как примечание, если вы новичок в Java и имеете возможность выбирать свои инструменты, я предлагаю взглянуть на Spring вместо этого. Автоконфигурация Spring Boot упрощает эту настройку и устраняет необходимость в внешнем контейнере. – chrylis

+0

@chrylis согласен, но может зависеть от его cicumstance ... плюс ejb стал легче в последние несколько лет – Crowie

ответ

1

кажется, что Джерси конфликты с Resteasy. Таким образом, у меня было 2 варианта:

  • Отключение отдыха на JBoss/Wildfly (я знаю, что это возможно, но я не знаю, как);
  • Удалите Джерси и вместо этого используйте Resteasy;

В итоге я выбрал второй вариант, потому что это было проще, и у меня нет причин использовать конкретно Джерси.

Таким образом, я должен был изменить свой web.xml, заменив это:

<servlet-name>Jersey Web Application</servlet-name> 
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
... 
<servlet-mapping> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <url-pattern>/webapi/*</url-pattern> 
</servlet-mapping> 

Для этого:

<servlet-name>javax.ws.rs.core.Application</servlet-name> 
... 
<servlet-mapping> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    <url-pattern>/webapi/*</url-pattern> 
</servlet-mapping> 

* Другой вариант заключается в создании класса простирающуюся класса Application.

* beans.xml не требуется.

Затем я аннотированный мой класс ресурсов с @Stateless, и я был в состоянии придать EntityManager правильно:

@Path("myresource") 
@Stateless 
public class MyResource { 

    @PersistenceContext(unitName="myPersistenceUnit") 
    private EntityManager em; 
... 

На данный момент, EntityManager было в порядке, но как-то он использует JBoss h2 в-Memmory базы данных (ExampleDS). Итак, я настроил оракул источник данных на JBoss (OracleDS) и обновил свой persistence.xml использовать OracleDS и JTA вместо «RESOURCE_LOCAL»:

<persistence-unit name="myPersistenceUnit" transaction-type="JTA"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <jta-data-source>java:jboss/datasources/OracleDS</jta-data-source> 
... 

С тех шагов, которые я был в состоянии придать EntityManager и сделать мой CRUD операции успешно.

0

Я думаю, менеджер Entity должен быть достаточно:

@PersistenceUnit(unitName= "myPersistenceUnit") 
    private EntityManager em; 
+0

, так как вы не можете внедрить менеджер сущности или фабрику управления сущностями в управляемый компонент, вам нужно ввести его в EJB bean, вам необходимо создать слой DAO, в котором вы определяете, что имеете дело с базой данных, и вставлять эти EJB в управляемый компонент, используя @EJB – Elgayed

+0

Поскольку я использую тип транзакции = «RESOURCE_LOCAL», я не могу внедрить EntityManager. Мне нужно ввести EntityManagerFactory, иначе я получаю сообщение об ошибке. –

+0

Я новичок в Java, поэтому позвольте мне посмотреть, понимаю ли я часть «EJB bean». Мне нужно создать проект EJB со всей моей конфигурацией персистентности, создать сессионный компонент и передать этот компонент в мой проект web/jersey с помощью @EJB? –

1

Там нет смысла для @ManagedBean аннотации здесь, это JSF аннотация, и я в соответствии с вашим кодом вы пытаетесь выставить слой REST.

Просто удалите его и все будет хорошо (также убедиться, что у вас есть beans.xml в вашем пути к классам, чтобы позволить CDI, в противном случае аннотировать класс с @Stateless)

+0

На самом деле я использовал аннотацию javax.annotation.ManagedBean. Я удалил @ManagedBean и EntityManagerFactory все еще null. У меня есть пустой beans.xml, и я вижу, что служба CDI была запущена в журнале консоли: [org.jboss.weld.deployer] (поток обслуживания MSC 1-5) WFLYWELD0006: запуск служб для развертывания CDI ... .. –

+0

Я аннотировал мой класс с @Stateless и не помог. –

Смежные вопросы