Разработка 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, и все отлично работает. Я могу запустить свой проект на сервере без каких-либо проблем.
логика
- Слой DAO читает / вставляет некоторые данные из контейнера JPA; манипулирует записями базы данных
- Я использую методы слоя DAO в контейнере EJB; Сессионные компоненты без сохранения состояния используют эти методы для отправки результатов в контейнер WAR.
- Управляемые компоненты JSF в контейнере WAR получают результаты от EJB Session Beans
- Полученные результаты затем отображаются на странице 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