2014-01-16 25 views
0

我有一个使用JPA的Java EE项目。 当我的服务器启动时,我的表是通过休眠自动生成的,因此我的实体正确。 我现在需要使用entitymanager插入/更新数据。 当我使用注解的实体管理器或使用entityManagerFactory的标准实体管理器时,我得到了NullPointer异常。EntityManager仍然为空注解或EntityManagerFactory方法

我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<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="LogmonPU" transaction-type="JTA"> 
       <provider>org.hibernate.ejb.HibernatePersistence</provider> 
       <jta-data-source>java:jboss/datasources/LogmonDS</jta-data-source> 
       <properties> 
         <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
         <property name="hibernate.hbm2ddl.auto" value="update" /> 
         <property name="hibernate.archive.autodetection" value="class" /> 
         <property name="hibernate.show_sql" value="true" /> 
         <property name="hibernate.format_sql" value="true" /> 
       </properties> 
     </persistence-unit> 
</persistence> 

我AbstractDao的类:

package com.st.safir.LogMonitoring.ejb; 

import java.io.Serializable; 
import java.util.Collection; 

import javax.persistence.EntityManager; 

/** 
* @author benoit brayer 
* 
* @param <E> 
*   The class entity needed to be mapped 
* @param <PK> 
*   The primary key type for this class 
*/ 
public abstract class AbstractDAO<E 
extends Serializable, PK extends Serializable> { 
    /** */ 
    private final transient Class<E> mEntityClass; 
    /** 
    * @param entityClass the entity needed to be mapped by the dao class 
    */ 
    public AbstractDAO(final Class<E> entityClass) { 
     mEntityClass = entityClass; 
    } 

    /** 
    * @return the EntityManager object corresponding to the mapped entity class 
    */ 
    protected abstract EntityManager getEntityManager(); 

    /** 
    * @return all objects mapped by entity 
    */ 
    protected abstract Collection<E> getAll(); 

    /** 
    * @param entity an instance of the entity needed to be add database 
    */ 
    public final void create(final E entity) { 
     final EntityManager entityManager = getEntityManager(); 
     entityManager.persist(entity); 
    } 

    /** 
    * @param id the id of the desired entity object 
    * @return the entity object matching the specified id 
    */ 
    public final E getById(final PK id) { 
     return getEntityManager().find(mEntityClass, id); 
    } 
} 

我EJB使用像我的模型:

package com.st.safir.LogMonitoring.ejb; 

import java.util.Collection; 

import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 

import com.st.safir.LogMonitoring.jpa.User; 

/** 
* @author benoit brayer 
*/ 
@Stateless(name = "userEJB") 
public class UserEJB extends AbstractDAO<User, Long> { 

    /** */ 
    @PersistenceContext(unitName = "LogmonPU") 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    /** */ 
    public UserEJB() { 
     super(User.class); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected Collection<User> getAll() { 
     Query query = em.createQuery("SELECT u from WEB_USER u"); 
     return (Collection<User>) query.getResultList(); 
    } 

    /** 
    * @param username the username matching the desired entity object 
    * @return the entity object corresponding to the database row 
    */ 
    public final User getUserByUsername(final String username) { 
     Query query = em 
       .createQuery("SELECT u from WEB_USER u where u.username = ?1") 
       .setParameter(1, username); 
     return (User) query.getSingleResult(); 
    } 

} 

错误日志:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.st.safir.LogMonitoring.jsf.index.IndexBean. 
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193) 
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102) 
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409) 
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269) 
    at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244) 
    at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116) 
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
    at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72) 
    at org.apache.el.parser.AstValue.getValue(AstValue.java:147) 
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) 
    at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:227) 
    at com.sun.faces.facelets.el.ELText$ELTextComposite.writeText(ELText.java:150) 
    at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85) 
    at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82) 
    at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) 
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:840) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:622) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:560) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:488) 
    at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:706) 
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:677) 
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:64) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) 
    at com.c2alliance.commons.sso.client.filter.AllianceCASAuthorizationFilter.doFilter(AllianceCASAuthorizationFilter.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) 
    at edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:473) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NullPointerException 
    at com.st.safir.LogMonitoring.ejb.UserEJB.getUserByUsername(UserEJB.java:43) 
    at com.st.safir.LogMonitoring.jsf.controller.UserControllerBean.isUserFirstLogin(UserControllerBean.java:42) 
    at com.st.safir.LogMonitoring.jsf.controller.UserControllerBean.webAppUserAuthentication(UserControllerBean.java:69) 
    at com.st.safir.LogMonitoring.jsf.index.IndexBean.<init>(IndexBean.java:51) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188) 
    ... 59 more 

在此先感谢。 问候

编辑:

控制器打电话给我的我的JSF托管bean处理业务逻辑: 包com.st.safir.LogMonitoring.jsf.controller;我的index.xhtml页面

import java.io.Serializable; 

import javax.annotation.ManagedBean; 
import javax.faces.bean.RequestScoped; 

import com.st.safir.LogMonitoring.ejb.UserEJB; 
import com.st.safir.LogMonitoring.jpa.User; 

/** 
* @author benoit brayer 
*/ 
@RequestScoped 
@ManagedBean 
public class UserControllerBean implements Serializable { 

    /** 
    * Generated attribute for Serialization. 
    * 
    * @attribute serialVersionUID serialisation id 
    * @see java.io.Serializable 
    */ 
    private static final long serialVersionUID = 1L; 

    /** */ 
    private User mUser; 

    /** 
    * @return true if it is the user first login & false if the user has 
    *   already an account 
    * @param username 
    *   the user username 
    */ 
    public final boolean isUserFirstLogin(final String username) { 
     Boolean firstLogin = true; 
     UserEJB userEjb = new UserEJB(); 
     User user = userEjb.getUserByUsername(username); 
     if (user != null) { 
      firstLogin = false; 
     } 
     return firstLogin; 
    } 


    /** 
    * Operations called after getting the usename 
    * of the user who logged-in using SSO. 
    * @param username 
    *   the user username 
    */ 
    public final void webAppUserAuthentication(final String username) { 
     User user = null; 
     UserEJB userEjb = new UserEJB(); 
     if (isUserFirstLogin(username)) { 
      user = new User(); 
      user.setUsername(username); 
      userEjb.create(user); 
     } else { 
      user = userEjb.getUserByUsername(username); 
     } 
     this.setUser(user); 
    } 

    .... other stuff 

我indexbean管理的bean:

/** JSF Facelet 
* @author Benoit Brayer 
* @imports java.io.Serializable; 
* @imports javax.faces.bean.ManagedBean; 
* @imports javax.faces.bean.RequestScoped; 
* @import javax.faces.context.FacesContext; 
* @import javax.servlet.http.HttpServletRequest; 
*/ 
package com.st.safir.LogMonitoring.jsf.index; 

import java.io.Serializable; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import javax.faces.context.FacesContext; 
import javax.servlet.http.HttpServletRequest; 

import com.st.safir.LogMonitoring.jsf.controller.UserControllerBean; 

/** 
* JSF ManagedBean for index page. 
*/ 
@RequestScoped 
@ManagedBean(name = "indexBean") 
public class IndexBean implements Serializable { 
    /** 
    * Generated attribute for Serialization. 
    * 
    * @attribute serialVersionUID serialisation id 
    * @see java.io.Serializable 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * Returns the name of the jsf Bean. 
    */ 
    private String mNom = "indexBean"; 

    /** */ 
    private UserControllerBean userController = new UserControllerBean(); 

    /** 
    * @return the name of the servlet 
    */ 
    public final String getNom() { 
     return mNom; 
    } 

    /** IndexBean constructor. */ 
    public IndexBean() { 
     userController.webAppUserAuthentication((((HttpServletRequest) 
     FacesContext.getCurrentInstance().getExternalContext().getRequest()) 
     .getUserPrincipal()).toString()); 
    } 

    ... other stuff 

我用最后解决一半,我的问题:代替

private EntityManager em = (EntityManager) Persistence 
     .createEntityManagerFactory("LogmonPU") 
     .createEntityManager(); 

@PersistenceContext(unitName = "LogmonPU") 
private EntityManager em; 

在我的EJB文件中。

添加论文线到我的persistence.xml:

<class>com.st.safir.LogMonitoring.jpa.User</class> 

<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory" /> 
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> 

我的实体管理器是不是更空,但在数据库中,我仍然无法插入。 此后,我的数据库中不会出现任何行。 我的JBoss的日志:

janv./17 15:20:19,710 INFO [stdout] (http-localhost-127.0.0.1-8080-1) Hibernate: 
janv./17 15:20:19,712 INFO [stdout] (http-localhost-127.0.0.1-8080-1)  select 
janv./17 15:20:19,715 INFO [stdout] (http-localhost-127.0.0.1-8080-1)   S_INC_TUSER.nextval 
janv./17 15:20:19,717 INFO [stdout] (http-localhost-127.0.0.1-8080-1)  from 
janv./17 15:20:19,719 INFO [stdout] (http-localhost-127.0.0.1-8080-1)   dual 

这基本上是我的序列ATO递增使用Oracle数据库我行。

+0

不应该用'@ Stateless'或'@ Stateful'注释'UserEJB'吗? –

+0

@Stateless(name = userEJB)之前有过,但由于某种原因我无意中删除了它。无论如何,我再次添加它,这并没有改变任何东西。感谢您的观察;) –

+0

看起来像你正在访问UserEJB作为一个Java类,而不是从服务器上查找它的实例。显示用于调用getUserByUsername的JSP的代码,但如果它没有从服务器中查找bean,则服务器无法将EM注入到该服务器中。 – Chris

回答

0

求解最后,问题

为了解决最后的问题,我改变了我的执着。这样的XML:

<persistence-unit name="LogmonPU" transaction-type="RESOURCE_LOCAL"> 

我也用这样的我的实体管理器从现在开始:

public final User create(final User entity) { 
    EntityManager entityManager = getEntityManager(); 
    entityManager.getTransaction().begin(); 
    entityManager.persist(entity); 
    entityManager.getTransaction().commit(); 
    entityManager.close(); 
    return entity; 
} 

这是exausted但我解决它终于-.-” 感谢它帮我的评论梳理出来。

相关问题