2013-05-31 70 views
0

使用JSF導致NullPointerException異常:顯示java.lang.NullPointerException在javax.faces.webapp.UIComponentClassicTagBase.setJspId

WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception 
java.lang.NullPointerException 
    at javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1858) 
    at org.apache.jsp.jsf.list_jsp._jspx_meth_h_form_0(list_jsp.java:112) 
    at org.apache.jsp.jsf.list_jsp._jspService(list_jsp.java:86) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:722) 

在我的lib我的GlassFish服務器和我的動態Web項目的文件夾中有以下幾種 罐子:

  • 標準1.1.2.jar
  • JSTL-JSTL-1.2.jar
  • JSP-API-2.1
  • JSF的IMPL-2.1.7.jar
  • JSF-API-2.2.0-m03.jar

我的豆:

@Stateless 
@Named 
public class StatelessBean { 

    public int getNumberOfMovies() { 
     return 42; 
    } 

    public int getNumberOfPersons() { 
     return 42; 
    } 
} 

我的JSF:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> 
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<link href="../css/basic.css" type="text/css" rel="stylesheet"> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Liste</title> 
</head> 
<body> 
    <h:form> 
     <h1>Stateless</h1> 
     <h:outputText value="Anzahl der Filme: #{StatelessBean.getNumberOfMovies()}" /> 
     <h:outputText value="Anzahl der Personen: #{StatelessBean.getNumberOfPersons()}" /> 
    </h:form> 
</body> 
</html> 

這裏提供的awnsers:stackoverflow沒有幫助。

不知道如何解決這個問題。

+0

我從來沒有見過由視圖內的大寫字母開始的bean名稱......此外,您應該使用'xmlns'而不是'taglib'。 –

+0

以帽子開頭的bean是一個嘗試...沒有帽子它也nullpointerexception。爲什麼xmlns? – Mulgard

+2

如果您想了解JSF 2.0而不是JSF 1.x,請閱讀JSF 2.0書籍/教程/資源。您使用的是自3年前以來JSF 2.0以來已棄用的JSP。這表明您正在閱讀完全過時的書籍/教程/資源。另外,你的'/ WEB-INF/lib'文件中存在'standard-1.1.2.jar'和'jsp-api-2.1.jar'文件是可怕的。您的JSF API和impl JAR在版本中也是不兼容的。你爲什麼那樣做?讀壞教程?在黑暗中拍攝?這些文件只會導致可移植性的麻煩。 – BalusC

回答

4

您應該更改您的視圖代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.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" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <link href="css/basic.css" type="text/css" rel="stylesheet"> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <title>Liste</title> 
    </h:head> 
    <h:body> 
     <h:form> 
      <h1>Stateless</h1> 
      <h:outputText value="Anzahl der Filme: #{statelessBean.getNumberOfMovies()}" /> 
      <h:outputText value="Anzahl der Personen: #{statelessBean.getNumberOfPersons()}" /> 
     </h:form> 
    </h:body> 
</html> 

這是JSF的方式做申報標籤庫。

您還需要改變你的web.xml一些配置和您的文件重命名爲yourfile.xhtml

<context-param> 
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
    <param-value>.xhtml</param-value> 
</context-param> 

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
</servlet> 

<!-- Use prefix mapping for Facelets pages, e.g. http://localhost:8080/webapp/yourfile.jspx --> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jspx</url-pattern> 
</servlet-mapping> 

要在EL表達式中使用你的bean,你需要改變這樣的:

@ManagedBean 
@RequestScoped 
public class StatelessBean { 

    public int getNumberOfMovies() { 
     return 42; 
    } 

    public int getNumberOfPersons() { 
     return 42; 
    } 
} 

更多信息:

+0

jsp不使用jsp使用taglibs嗎? – Adarsh

+0

但這也不起作用:org.apache.jasper.JasperException:/jsf/list.jsp(25,43)PWC6228:#{...}不允許在模板文本正文中使用。 – Mulgard

+0

好吧,我得到至少一個輸出。但 - >沒有CSS正在工作 - 「我的」statelessBean.getNumberOfMovies()「沒有工作(沒有輸出) – Mulgard

0

嘗試將呼叫更改爲getNumberOfMovies。 JSF默默地將'get'和括號'()'添加到html中的值。這個想法是你寫getters和setter,然後命名這個屬性,JSF調用相應的屬性。

<h:outputText value="Anzahl der Filme: #{statelessBean.numberOfMovies}" /> 
     <h:outputText value="Anzahl der Personen: #{statelessBean.numberOfPersons}" /> 

但是,這會調用propertyNotFoundException。它也可能是你的空指針的原因,但我不確定。

相關問題