我一直在試圖使利用Java的EL一個JSF頁面數據庫中的信息,但是我已經找回了以下內容:JSF HandleRenderException由於NullPointerException異常
com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error rendering View[/customerInformation.xhtml]
java.lang.NullPointerException
它從那裏繼續(見完整的錯誤報告在下面)。
從我的理解,因爲沒有我的代碼合併到我的代碼似乎已達成,包含它們的方法從未實際執行。這導致我相信:
- 根據我以前的線程,我可能仍然使用EL不正確,並遇到問題,因爲有一些誤解。我可能已經超越了這些錯誤,但是我真的明白了原因嗎?
- 該bean或與之相連的東西從未被初始化,從而導致空指針異常。
- 我對JSF標籤的使用並未實際完成我正在嘗試做的事情
- 其他事情正在發生我還沒有想到或理解。
某些系統和圖書館信息:
- 的CentOS 6.5
- 的Eclipse IDE開普勒的Java EE開發
- JRE系統庫【JAVA-1.7.0-的OpenJDK,1.7.0.45.x86_64 ]
- 的Apache Tomcat V7.0
- 阿帕奇TomEE 1.6.0 JAX-RS
- JSF Mojara 2.2(javax.faces的.jar)
- 的log4j 1.2.17(log4j的-1.2.17.jar)
的視圖:(customerInformation.xhtml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Customer Information</title>
</h:head>
<h:body>
<h1>Customer:</h1>
<h:dataTable value="#{customerBean.getFirstCustomer()}" var="cust"
id="custTable">
<h:column id="idCol">
<f:facet name="header">
ID:
</f:facet>
#{cust.id}
</h:column>
<h:column id="firstnameCol">
<f:facet name="header">
First Name:
</f:facet>
#{cust.firstname}
</h:column>
<h:column id="lastnameCol">
<f:facet name="header">
Last Name:
</f:facet>
#{cust.lastname}
</h:column>
<h:column id="creditcardCol">
<f:facet name="header">
Credit Card:
</f:facet>
#{cust.creditcard}
</h:column>
<h:column id="cidCol">
<f:facet name="header">
CID:
</f:facet>
#{cust.cid}
</h:column>
<h:column id="addressCol">
<f:facet name="header">
Address:
</f:facet>
#{cust.address}
</h:column>
</h:dataTable>
</h:body>
</html>
支持bean(CustomerBean.java):
package customer;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.apache.log4j.Logger;
import customer.model.Customer;
@ManagedBean(name="customerBean", eager=true)
@SessionScoped
public class CustomerBean implements Serializable {
private static final long serialVersionUID = 1L;
private static transient Logger log =
Logger.getLogger(CustomerBean.class.getName());
private static final String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DB_URL = "jdbc:oracle:thin:@//localhost:1521/xe";
private static final String DB_USER = "username";
private static final String DB_PASS = "password";
private Connection getConnection() {
Connection conn = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
log.warn("Oracle JDBC Driver not found!", e);
}
try {
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
} catch (SQLException e) {
log.fatal("ERROR: Could not establish a connection to the database!", e);
}
assert(conn != null);
return conn;
}
private ResultSet queryDatabase(String queryString) {
ResultSet queryResponse = null;
PreparedStatement query = null;
if (queryString == null) {
return null;
}
Connection databaseConnection = connect();
try {
query = databaseConnection.prepareStatement(queryString);
} catch (SQLException e) {
log.warn("Failed to prepare database query!", e);
}
assert(query != null);
try {
queryResponse = query.executeQuery();
} catch (SQLException e) {
log.warn("Failed to execute database query!", e);
}
assert(queryResponse != null);
return queryResponse;
}
public Customer getFirstCustomer() {
Customer customer = new Customer();
ResultSet queryResponse = null;
List<Customer> customerList = new ArrayList<Customer>();
queryResponse = queryDatabase(
"SELECT ID01, FIRSTNAME, LASTNAME, CREDITCARD, CID, ADDRESS FROM SCOTT.CUSTOMER_CC");
try {
Customer cust = new Customer();
while (queryResponse.next()) {
cust.setId(queryResponse.getInt("ID01"));
cust.setFirstname(queryResponse.getString("FIRSTNAME"));
cust.setLastname(queryResponse.getString("LASTNAME"));
cust.setCreditcard(queryResponse.getString("CREDITCARD"));
cust.setCid(queryResponse.getString("CID"));
cust.setAddress(queryResponse.getString("ADDRESS"));
customerList.add(cust);
}
} catch (SQLException e) {
log.warn("Failed to build customer from query response.", e);
}
assert(!customerList.isEmpty());
customer = customerList.get(0); // Arbitrarily pick the first customer
return customer;
}
}
目前我只創建了一個方法public Customer getFirstCustomer()
。我們的目標是將其轉換爲方法public List<Customer> getCustomerList()
,以便用所有客戶的信息填充數據表。一旦我解決了我的問題,這可能嗎?
客戶POJO(Customer.java):
package customer.model;
public class Customer {
private int id;
private String firstname;
private String lastname;
private String creditcard;
private String cid;
private String address;
// For brevity sake, the getters and setters are here (generated)
}
現在的錯誤日誌(我已經成立了,在有關應用程序的渲染階段的信息添加的PhaseListener你會注意到。在Render Response階段出現錯誤):
2014-02-24 15:55:50,666 TRACE [http-bio-8080-exec-3] - test.debugPack.DebugPhaseListener.beforePhase 23 - Entering phase: [RESTORE_VIEW 1]
2014-02-24 15:55:50,768 TRACE [http-bio-8080-exec-3] - test.debugPack.DebugPhaseListener.afterPhase 18 - Completed phase: [RESTORE_VIEW 1]
2014-02-24 15:55:50,773 TRACE [http-bio-8080-exec-3] - test.debugPack.DebugPhaseListener.beforePhase 23 - Entering phase: [RENDER_RESPONSE 6]
Feb 24, 2014 3:55:51 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/customerInformation.xhtml]
java.lang.NullPointerException
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:225)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:225)
at org.apache.el.parser.AstValue.getValue(AstValue.java:173)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIData.getValue(UIData.java:732)
at javax.faces.component.UIData.getDataModel(UIData.java:1811)
at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
at javax.faces.component.UIData.setRowIndex(UIData.java:473)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:82)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:869)
at javax.faces.component.UIData.encodeBegin(UIData.java:1133)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1854)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:701)
Feb 24, 2014 3:55:51 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/JSF_Remote_Data_Test] threw exception [null] with root cause
java.lang.NullPointerException
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:225)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:225)
at org.apache.el.parser.AstValue.getValue(AstValue.java:173)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIData.getValue(UIData.java:732)
at javax.faces.component.UIData.getDataModel(UIData.java:1811)
at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
at javax.faces.component.UIData.setRowIndex(UIData.java:473)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:82)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:869)
at javax.faces.component.UIData.encodeBegin(UIData.java:1133)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1854)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:701)
2014-02-24 15:55:51,357 TRACE [http-bio-8080-exec-3] - test.debugPack.DebugPhaseListener.afterPhase 18 - Completed phase: [RENDER_RESPONSE 6]
我已經測試了一個普通的Java項目中的JDBC代碼,並能夠連接到和查詢數據庫,成功地顯示輸出到控制檯。這至少證明了我正在使用的底層接口機制應該起作用,並將我的關注更多地指向我使用JSF和EL。
除了想更好地瞭解是什麼導致了我的問題,以及如何解決它,我還想知道一些額外的信息。在應用程序生命週期中,是否創建了支持bean的實例?爲了什麼目的(即:爲Connection實例創建一個成員字段並在後期構造方法中獲取它),我需要或者更好的做法是使用@PostConstruct方法和我的bean?最重要的是,什麼是EL在做什麼,並且是否有可能調用常規方法(而不是吸氣劑或設置器,因爲我正在試圖用getFirstCustomer()
使用EL?
非常感謝您的閱讀。幫助和建議!
創建一個新方法,它將返回List並在'h:dataTable'中調用此方法 –
嗯。方法getFirstCustomer()我最初設計的只是返回列表。而不是採取列表的第一個元素,並將其分配給客戶價值,在while循環後,它只是返回列表。但是,這也給了我這個相同的錯誤。所以我需要在繼續前解決這個問題。 – MarekVarro