Разработка Java EE в Eclipse; Исключение Entity Manager

Я пытаюсь создать приложение Java Enterprise, используя Eclipse IDE с сервером JBoss 7.0. У меня уже был опыт разработки таких приложений, но с использованием среды IDE NetBeans. Основной проблемой для меня являются различия между этими двумя IDE. В настоящее время Eclipse дает мне головную боль при настройке основных функций.

Структура проекта выглядит выше. Я создал приложение Java EE с 3 отдельными контейнерами - по одному для EJB, JPA и WEB:

EAR:

-EJB -> contains SessionBeans and all the business logic

-JPA -> contains database entities (MySQL) and DAO layer

-WAR -> contains JSF (.xhtml) pages and JSF Managed Beans

Я настроил эти 3 контейнера для совместной работы, как в среде Java EE, и все отлично работает. Я могу запустить свой проект на сервере без каких-либо проблем.

логика

  1. Слой DAO читает / вставляет некоторые данные из контейнера JPA; манипулирует записями базы данных
  2. Я использую методы слоя DAO в контейнере EJB; Сессионные компоненты без сохранения состояния используют эти методы для отправки результатов в контейнер WAR.
  3. Управляемые компоненты JSF в контейнере WAR получают результаты от EJB Session Beans
  4. Полученные результаты затем отображаются на странице JSF с использованием объекта JSF Managed Bean

проблема

Я столкнулся с проблемой при попытке реализовать некоторые базовые функции, такие как чтение из базы данных. Я предполагаю, что проблема, с которой я сталкиваюсь, является проблемой с EntityManager.

Конкретная проблема

У меня есть уровень DAO, который содержит класс UserDAOImpl, который реализует интерфейс IUserDAO, как показано ниже.

Интерфейс IUserDAO:

public interface IUserDAO {
    public List<User> getAllUsers();
}

Класс UserDAOImpl:

public class UserDAOImpl implements IUserDAO {
//  @PersistenceContext(unitName="eLearningJJ-jpa") 
//  protected EntityManager entityManager;

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("eLearningJJ-jpa");
    private EntityManager manager    = emf.createEntityManager(); 
    private List<User> users    = new ArrayList<User>();    

    @Override
    public List<User> getAllUsers() {
        users = manager.createNamedQuery("User.findAll", User.class).getResultList();
        return users;
    }

}

Этот слой должен манипулировать записями или сущностями базы данных, если хотите.

Класс сущности пользователя

@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="USER_ID")
    private int userId;

    @Column(name="USER_NAME")
    private String userName;

    @Column(name="USER_PASSWORD")
    private String userPassword;

    public User() {
    }

    public int getUserId() {
        return this.userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return this.userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

}

Поскольку я хочу выполнить всю бизнес-логику в контейнере EJB, у меня есть компонент UserStateless, который реализует локальный интерфейс UserStatelessLocal, как показано ниже:

Бин UserStateless:

@Stateless
@LocalBean
public class UserStateless implements UserStatelessLocal {


    public UserStateless() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public List<User> getAllUsers() {
        IUserDAO userDao = new UserDAOImpl();
        return userDao.getAllUsers();
    }

}

Интерфейс UserStatelessLocal:

@Local
public interface UserStatelessLocal {
    public List<User> getAllUsers();
}

Теперь метод getAllUsers() вызывается управляемым компонентом JSF в веб-контейнере, поэтому я могу перечислить всех пользователей на странице JSF. Это выглядит как внизу:

LoginBean JSF управляемый компонент:

@ManagedBean 
@SessionScoped 
public class LoginBean
{

    @EJB
    UserStatelessLocal userStatelessBean;
    ...
    public List<User> getUsers() {
        return userStatelessBean.getAllUsers();
    }

    ...
}

Метод getUsers() вызывается на странице index.xhtml, как показано ниже:

<h:dataTable value="#{loginBean.users}" var="user" >
        <h:column>
            <h:outputText value="#{user.userName}" />
        </h:column>
</h:dataTable>

Подвести итоги

Основная проблема для меня - это когда я пытаюсь реализовать EntityManager в классе UserDAOImpl. Как только я добавляю эти 2-3 строки кода, я получаю исключение NullPointerException. Это трассировка стека:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.NullPointerException
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
root cause

javax.ejb.EJBException: java.lang.NullPointerException
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:193)
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:261)
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:359)
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invoke(CMTTxInterceptor.java:219)
    org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:35)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor.processInvocation(SessionInvocationContextInterceptor.java:71)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:146)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:76)
    com.elearningjj.beans.UserStatelessLocal$$$view1.getAllUsers(Unknown Source)
    com.elearningjj.jsfbeans.LoginBean.getKorisnici(LoginBean.java:45)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstValue.getValue(AstValue.java:134)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:193)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:181)
    javax.faces.component.UIData.getValue(UIData.java:557)
    javax.faces.component.UIData.getDataModel(UIData.java:1297)
    javax.faces.component.UIData.setRowIndex(UIData.java:450)
    com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
    javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:828)
    javax.faces.component.UIData.encodeBegin(UIData.java:940)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
root cause

java.lang.NullPointerException
    org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:72)
    org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:114)
    org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149)
    org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1197)
    org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:170)
    org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:90)
    org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:111)
    org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:106)
    com.elearningjj.dao.UserDAOImpl.<init>(UserDAOImpl.java:25)
    com.elearningjj.beans.UserStateless.getAllUsers(UserStateless.java:28)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:51)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:45)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:44)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    org.jboss.as.ee.component.ViewDescription$ComponentDispatcherInterceptor.processInvocation(ViewDescription.java:202)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:44)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor$CustomSessionInvocationContext.proceed(SessionInvocationContextInterceptor.java:126)
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:257)
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:359)
    org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invoke(CMTTxInterceptor.java:219)
    org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:35)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor.processInvocation(SessionInvocationContextInterceptor.java:71)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:146)
    org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287)
    org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:76)
    com.elearningjj.beans.UserStatelessLocal$$$view1.getAllUsers(Unknown Source)
    com.elearningjj.jsfbeans.LoginBean.getKorisnici(LoginBean.java:45)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstValue.getValue(AstValue.java:134)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:193)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:181)
    javax.faces.component.UIData.getValue(UIData.java:557)
    javax.faces.component.UIData.getDataModel(UIData.java:1297)
    javax.faces.component.UIData.setRowIndex(UIData.java:450)
    com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
    javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:828)
    javax.faces.component.UIData.encodeBegin(UIData.java:940)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
note The full stack trace of the root cause is available in the JBoss Web/7.0.1.Final logs.

Мой persistance.xml в контейнере JPA выглядит так:

<persistence version="2.0" 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_2_0.xsd">
    <persistence-unit name="eLearningJJ-jpa" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>

      <class>com.elearningjj.entities.User</class>
         <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
         </properties>
    </persistence-unit>
</persistence>

Я с нетерпением жду ваших комментариев. Если вам нужны дополнительные подробности, я готов показать вам;-)

Спасибо.

1 ответ

Ваш EJB должен быть указан по имени, я думаю:

@EJB(mappedName="UserStatelessLocal/local")

Другая возможность - получить EJB от JNDI.

Вероятно, это проблема именования JBoss, а не Eclipse

Другие вопросы по тегам