【发布时间】: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 环境一样协同工作,并且一切正常。我可以毫无问题地在服务器上运行我的项目。
逻辑
- DAO 层正在从 JPA 容器中读取/插入一些数据;它操纵数据库条目
- 我在 EJB 容器中使用 DAO 层的方法;无状态会话 Bean 正在使用这些方法将结果发送到 WAR 容器
- WAR 容器中的 JSF 托管 bean 接收来自 EJB 会话 Bean 的结果
- 然后使用 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