2014-02-24 48 views
2

我一直在試圖使利用Java的EL一個JSF頁面數據庫中的信息,但是我已經找回了以下內容:JSF HandleRenderException由於NullPointerException異常

com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException 
SEVERE: Error rendering View[/customerInformation.xhtml] 
java.lang.NullPointerException 

它從那裏繼續(見完整的錯誤報告在下面)。

從我的理解,因爲沒有我的代碼合併到我的代碼似乎已達成,包含它們的方法從未實際執行。這導致我相信:

  1. 根據我以前的線程,我可能仍然使用EL不正確,並遇到問題,因爲有一些誤解。我可能已經超越了這些錯誤,但是我真的明白了原因嗎?
  2. 該bean或與之相連的東西從未被初始化,從而導致空指針異常。
  3. 我對JSF標籤的使用並未實際完成我正在嘗試做的事情
  4. 其他事情正在發生我還沒有想到或理解。

某些系統和圖書館信息:

  • 的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?

非常感謝您的閱讀。幫助和建議!

+0

創建一個新方法,它將返回List並在'h:dataTable'中調用此方法 –

+0

嗯。方法getFirstCustomer()我最初設計的只是返回列表。而不是採取列表的第一個元素,並將其分配給客戶價值,在while循環後,它只是返回列表。但是,這也給了我這個相同的錯誤。所以我需要在繼續前解決這個問題。 – MarekVarro

回答

1

這絕對是一個非常粗略的答案,我將尋找更多的進入原因我的結果。

然而,在試圖隔離在這個項目中,我成立了一個新的問題工作區,將項目文件夾從其他工作區複製到磁盤上的新工作區位置,然後通過Eclipse導入項目。這樣做後,我遇到了一些問題,這些問題是由n沒有爲新工作區設置服務器連接。這是通過在工作區內創建一個新的服務器實例解決的,保留了Tomcat 7.0的默認值。

然後,我運行我的項目,並收到com.sun.faces.config.ConfigureListener找不到類的異常。這我知道,在我的web.xml文件中進行設置,所以我很快就這麼做可以除去以下行

<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

從我的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" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

    <!-- Project Name --> 
    <display-name>mkyong test</display-name> 

    <!-- Context Parameters --> 
    <context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
    </context-param> 

    <!-- Landing Page --> 
    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 

    <!-- Error Page --> 
    <error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/error.xhtml</location> 
    </error-page> 

    <!-- Servlet --> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Servlet Mappings --> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
     <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.faces</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <!-- Context Parameters --> 
    <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> 

    <!-- Resource References --> 

    <!-- Listeners --> 
    <listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 

</web-app> 

同樣,我跑該項目和這一次呈現的頁面沒有拋出錯誤,甚至顯示了存儲在我數據庫中的信息。

現在奇怪的是,該表所代表的信息是兩行重複信息。我有兩個客戶存儲在數據庫中,但其中只有一個顯示在表的兩行中。這很奇怪,因爲我修改了getFirstCustomer()方法來返回客戶列表,而不僅僅是上面看到的客戶。所以,現在它看起來像這樣:

public List<Customer> getCustomerList() { 
     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()); 

     return customerList; 
} 

無論如何,這是接近獲得該項目正常運行了一步,而且似乎解決我原來問的問題。

最奇怪的是,這個解決方案對兩個工作區中的兩個項目都有效,但是其他工作區中的原始項目也遇到了一些其他問題,這些問題讓我相信我的某些資源之間存在衝突。 jar文件。我會更多地關注它,看看我能否更明確地知道究竟出了什麼問題,以及爲什麼這個解決方案能夠工作。

乾杯!

+0

重複行的問題在於getFirstCustomer()方法現在更好地命名爲getCustomerList(),即客戶對象在while循環之外被初始化。因此,在while循環中,我使用相同的對象引用將新數據添加到列表中,覆蓋舊數據。通過在while循環中移動Customerr cust = new Customer()'行,此問題已得到解決。 – MarekVarro

0

我不確定它會對您有所幫助,但它可以幫助其他人。 我不得不引起評論EL同一個問題:

評論表達語言的正確方法是使用<ui:remove>標籤。