【问题标题】:Developing Java EE in Eclipse; Entity Manager Exception在 Eclipse 中开发 Java EE;实体管理器异常
【发布时间】:2014-11-03 11:43:46
【问题描述】:

我正在尝试使用带有 JBoss 7.0 服务器的 Eclipse IDE 创建一个 Java 企业应用程序。我已经有开发此类应用程序但使用 NetBeans IDE 的经验。对我来说主要问题是这两个 IDE 之间的差异。目前,Eclipse 让我对配置基本功能感到头疼。

项目结构如上所示。我用 3 个独立的容器构建了 Java EE 应用程序 - 一个用于 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. 我在 EJB 容器中使用 DAO 层的方法;无状态会话 Bean 正在使用这些方法将结果发送到 WAR 容器
  3. WAR 容器中的 JSF 托管 bean 接收来自 EJB 会话 Bean 的结果
  4. 然后使用 JSF Managed Bean 的对象将接收到的结果显示在 JSF 页面上

问题

当我尝试实现一些基本功能(例如从数据库读取)时遇到了问题。我假设我面临的问题是 EntityManager 的问题。

具体问题

我的 DAO 层包含实现 IUserDAO 接口的 UserDAOImpl 类,如下所示。

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 Bean,它实现了本地接口 UserStatelessLocal,如下所示:

UserStateless bean:

@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() 由 Web 容器中的 JSF 托管 Bean 调用,因此我可以在 JSF 页面上列出所有用户。如下所示:

LoginBean jsf 托管 bean:

@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>

总结

我的主要问题是当我尝试在 UserDAOImpl 类中实现 EntityManager 时。一旦我添加了这 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.

我在 JPA 容器中的 persistence.xml 如下所示:

<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>

我期待见到您的 cmets。如果您需要一些额外的细节,我愿意向您展示;-)

谢谢。

【问题讨论】:

    标签: java eclipse jakarta-ee jpa entitymanager


    【解决方案1】:

    我认为您的 EJB 需要通过名称来引用:

    @EJB(mappedName="UserStatelessLocal/local")

    另一种可能是通过JNDI获取EJB

    这可能是 JBoss 命名问题,而不是 Eclipse 问题

    【讨论】:

    • JBoss 命名怎么样?那么 JBoss JNDI 绑定呢?我应该把它搞砸吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2023-03-13
    • 2015-05-05
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多