另一個'EntityManager爲空'的問題。我搜索了一個答案,但沒有找到一個適合我的。我正在接管一個大型項目,我試圖簡化它以在調試時切出紅鯡魚。我只是簡單的客戶/訂單系統,我只是想部署它並查看客戶列表。基於另一個問題,我問及resulting suggestion我到以下(實際問題和堆棧跟蹤底部):EntityManager空指針異常
的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>
CustomerController.java
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;
}
}
我的應用程序部署,但我得到了無處不在的NullPointerException
試圖查看menu.xhtml
頁面時。當部署應用程序將記錄以下:
-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 is null:true |#]
-INFO | javax.enterprise.resource.webcontainer.jsf.config |初始化Mojarra 2.1.6(SNAPSHOT 20111206)上下文'/MyWebApp-0.0.1-SNAPSHOT'|# ]
-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] |#]
-INFO | javax.enterprise.system.tools.admin.org.glassfish.deployment.admin | MyWebApp-0.0.1-SNAPSHOT | 0.0.1-SNAPSHOT已成功部署在1,598毫秒。|#]
當我導航到MYSERVER:8080/MyWebApp-0.0.1-SNAPSHOT /面/的index.xhtml以下記錄:
[#| 2014-06-06T16:51:56.988 + 0100 |嚴重| glassfish3.1.2 | javax.enterprise.resource。webcontainer.jsf.application | _ThreadID = 36; _ThreadName = Thread-2; |錯誤呈現視圖[/index.xhtml]
javax.el.ELException:/templates/menu.xhtml @ 15,64 value =「#{customerController .getUrl()}「:org.jboss.weld.exceptions.WeldException:WELD-000049無法在my.webapp.web.controller上調用[method] @PostConstruct public my.webapp.web.controller.CustomerController.init .CustomerController @ 4085f7ff
在com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
在javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
.. [long stack trace] ...
引起:java.lang.NullPointerException
a噸my.model.Customer.getAllRecords(Customer.java:64)
在my.webapp.web.controller.CustomerController.findAll(CustomerController.java:41)
在my.webapp.web.controller.CustomerController.init (CustomerController.java:37)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
... [長堆棧跟蹤] .. 。
無記錄在postInject()
方法Customer
,CustomerController
正在輸出PersistenceStoreManager
。由於它們注有@PostConstruct
,應在注入後調用,因此我認爲EJB注入沒有發生。
任何人都可以看到爲什麼EJB注入沒有發生?
非常感謝,這是一個更基本的問題的結果 - 我試圖讓一個實體做自己的持久性。該任務應該被分配給控制器,然後由控制器進行容器管理。我將'psm'對象和使用它的方法移到了'CustomerController'類中,並將它改爲非靜態的(就像你引用的規範中所指出的那樣)並且它正在工作! – user3337410