2014-06-06 6 views
0

또 다른 'EntityManager is null'질문입니다. 나는 대답을 찾았지만 나를 위해 일하는 것을 찾지 못했습니다. 큰 프로젝트를 맡고 있고 디버깅 할 때 빨간 청어를 잘라내려고 단순화하려고합니다. 나는 단순한 고객/주문 시스템에 종사하고 있으며 나는 단지 그것을 배치하고 고객 목록을 보려고한다. 또 다른 질문을 바탕으로 내가 물었다과 resulting suggestion 나는 다음 (하단에 실제 질문 스택 추적) 아래로 해요 :EntityManager NullPointerException

의 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="my_PU" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>my_datasource</jta-data-source> 
     <class>my.database.model.Customer</class> 
     <class>my.database.model.Order</class> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    </persistence-unit> 
</persistence> 

web.xml을

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>MyWebApp</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>resources.application</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name> 
    <param-value>/WEB-INF/balusc.taglib.xml</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <filter> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
    <context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
    </context-param> 
    <listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 
</web-app> 

웹 페이지 - menu.xhtml

<html 
xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<head> 
<link rel="stylesheet" type="text/css" media="screen,projection" 
    href="../css/menu.css" /></head> 
<ui:component> 
    <div class="menu-container"> 
     <div class="menu-tab"> 
      <ul> 
       <li><a href="index.xhtml"><span>Home</span></a></li> 

       <li><h:outputLink 
         value="#{customerController.getUrl()}"> 
         <span><h:outputText value="Customer" /></span> 
        </h:outputLink></li> 
       <li><a href=""><span>Logout</span></a></li> 
      </ul> 
     </div> 
    </div> 
</ui:component> 
</html> 

고객 담당자 웹.

package my.webapp.web.controller; 

import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 
import my.model.Customer; 

@Named(value = "customerController") 
@RequestScoped 
public class CustomerController// extends FormRequestController 
{ 
    private Customer customer; 
    private String id; 
    protected List<?> entityObjectList; 
    protected boolean editMode; 

    @PostConstruct 
    public void init() { 
     System.out.println("CustomerController init"); 
     setEntityObjectList(findAll()); 
    } 

    public List<?> findAll() { 
     List<Customer> dataList = Customer.getAllRecords(); 
     return dataList; 

    } 

    public String getUrl() 
    { 
     System.out.println("CustomerController getUrl"); 
     return "www.google.com"; 
    } 
    //getters and setters ommitted for brevity 
} 

Customer.java

package my.model; 

import java.io.Serializable; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import javax.ejb.EJB; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import my.database.manager.PersistenceStoreManager; 

@Entity 
@Table(name=Customer.TBL_NAME) 
@NamedQueries({ 
    @NamedQuery(name=Customer.QRY_ALL, query="select object(a) from Customer a") 
}) 
public class Customer implements Serializable { 
    private static final long serialVersionUID = 1L; 

    /** 
    * Manager class to manager DB connections 
    */ 
    @EJB 
    private static PersistenceStoreManager<Customer> psm; 
    // Table constants 
    public static final String TBL_NAME = "Customer"; 
    public static final String QRY_ALL = TBL_NAME + ".all"; 

    private int id; 
    private String name; 
    private Set<Order> orders; 

    public Customer() { 
    } 


    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public int getId() { 
     return this.id; 
    } 

    //bi-directional many-to-one association to Order 
    @OneToMany(mappedBy="id") 
    public Set<Order> getOrders() { 
     return this.orders; 
    } 

    public void setOrders(Set<Order> orders) { 
     this.orders = orders; 
    } 

    public static List<Customer> getAllRecords(){ 
     Map<String, Object> params = new HashMap<String, Object>(); 
     return psm.getResultSetList(QRY_ALL, params); 
    } 
    //other getters and setters omitted for brevity 
} 

PersistenceStoreManager.java

package my.database.manager; 

import java.util.List; 
import java.util.Map; 
import javax.annotation.PostConstruct; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 

/** 
* This class is responsible for performing CRUD operations using the 
* EntityManager of the PersistenceContext. 
* 
* 
*/ 
@Stateless 
public class PersistenceStoreManager<T> 
{ 
    @PersistenceContext(unitName = "my_PU") 
    private EntityManager em; 


    public PersistenceStoreManager() 
    { 
     System.out.println("PersistenceStoreManager loaded"); 
     System.out.println("em is null: "+(em==null)); 
    } 

    @PostConstruct 
    public void postInject() 
    { 
     System.out.println("postInject"); 
     System.out.println("em is null: "+(em==null)); 
    } 

    /** 
    * @param namedQuery 
    * @param criteria 
    * @return 
    */ 
    public List<T> getResultSetList(String namedQuery, 
      Map<String, Object> criteria) { 

     Query q = em.createNamedQuery(namedQuery); 
     for (Map.Entry<String, Object> entry : criteria.entrySet()) { 
      q.setParameter(entry.getKey(), entry.getValue()); 
     } 
     List<T> resultSetList = q.getResultList(); 
     return resultSetList; 
    } 
} 

내 응용 프로그램 전개함에하지만 menu.xhtml 페이지를 표시 할 때 나는 유비쿼터스 NullPointerException를 얻을. 의 I 내 응용 프로그램을 배포 할 때 기록됩니다

-warning을 | org.apache.catalina.connector.Request | _ThreadID = 37; _ThreadName = 스레드 2; | PWC4011 : UTF에 요청 문자 인코딩을 설정할 수 없습니다 -8 요청 매개 변수가 이미 읽혀 지거나 ServletRequest.getReader()가 이미 호출 되었기 때문에 | #]
-INFO | uploadFileName = MyWebApp-0.0.1-SNAPSHOT.war | #]
-INFO | javax.enterprise.system.container.ejb.com.sun.ejb.containers | EJB PersistenceStoreManager의 이식 가능한 JNDI 이름 : [java : global/MyWebApp-0.0.1-SNAPSHOT/PersistenceStoreManager, java : global/MyWebApp-0.0.1- SNAPSHOT/PersistenceStoreManager! my.database.manager.PersistenceStoreManager] | #]
-INFO | javax.enterprise.system.std.com.sun.enterprise.server.logging | PersistenceStoreManager로드 됨 | #]
-INFO | javax.enterprise.system.std.com.sun.enterprise.server.logging | em가 null 인 경우 true : | #]
-INFO | javax.enterprise.resource.webcontainer.jsf.config | 컨텍스트 '/MyWebApp-0.0.1-SNAPSHOT'|#에 대한 Mojarra 2.1.6 (SNAPSHOT 20111206) 초기화 중 ]
-INFO | org.primefaces.webapp.PostConstructApplicationEventListener | PrimeFaces 3.4.1에서 실행 | #]
-INFO | javax.enterprise.system.container.web.com.sun.enterprise.web | WEB0671 : 응용 프로그램로드 중 [/MyWebApp-0.0.1-SNAPSH 6243 OT]의 [MyWebApp-0.0.1-SNAPSHOT] | #]
-INFO | javax.enterprise.system.tools.admin.org.glassfish.deployment.admin | MyWebApp- 0.0.1-SNAPSHOT은 1,598 밀리 초 안에 성공적으로 배포되었습니다. | #]

다음 로깅 index.xhtml/8080/MyWebApp로-0.0.1-SNAPSHOT/얼굴 :

내가 myserver로로 이동하면

[# | 2014-06-06T16 : 51 : 0100 + 56.988 | 심각 | glassfish3.1.2 | javax.enterprise.resource.오류 렌더링보기 [/index.xhtml]
javax.el.ELException : /templates/menu.xhtml @ 15,64 value = "# {customerController .getUrl()} ": org.jboss.weld.exceptions.WeldException : WELD-000049 [메소드]를 호출 할 수 없습니다. @PostConstruct public my.webapp.web.controller.CustomerController.init() on my.webapp.web.controller .CustomerController @ javax.faces.component.ComponentStateHelper.eval에서 com.sun.faces.facelets.el.TagValueExpression.getValue (TagValueExpression.java:114)에서

(ComponentStateHelper.java:194) 4085f7ff
.. . [long stack trace] ...
에 의해 발생 : java.lang.NullPointerException
a t my.model.Customer.getAllRecords (Customer.java:64)
at my.webapp.web.controller.CustomerController.findAll (CustomerController.java:41)
at my.webapp.web.controller.CustomerController.init (CustomerController.java:37) sun.reflect.NativeMethodAccessorImpl.invoke0 (원시 메소드) sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
에서
에서
... [긴 스택 트레이스] .. .

Customer에서 postInject() 방법에 로깅

없음, CustomerControllerPersistenceStoreManager이 출력되고 있습니다. 그들은 @PostConstruct으로 주석을 달았고 주입 후에 호출되어야하기 때문에 EJB 주입이 일어나지 않는다고 가정합니다.

EJB 주입이 일어나지 않는 이유는 누구나 볼 수 있습니까?

답변

1

EJB는 컨테이너 관리 클래스에만 삽입 될 수 있고 엔티티는 컨테이너 관리 클래스가 아니기 때문에 삽입되지 않습니다. 컨테이너 관리 클래스는 예를 들어 Java EE 6 specification에 나열됩니다.

+0

감사합니다.이 문제는 근본적인 문제의 결과였습니다. 엔티티가 자체적 인 영속성을 갖도록하기 위해 노력하고있었습니다. 그 작업은 콘테이너로 관리 될 컨트롤러에 실제로 지정되어야합니다. 나는'psm' 객체와 그것을'CustomerController' 클래스에 사용하는 메소드를 옮기고 비 정적으로 변경했습니다 (당신이 참조한 스펙에 나와 있습니다). – user3337410