生成的JSP代码中调用setJspId()的NullPointerException

时间:2012-12-16 06:06:27

标签: jsp jboss nullpointerexception

我正在尝试从JBoss 7.1.1上的Java EE 5教程部署Duke的Bank示例。我只使用(未更改)源代码,以及用于部署的标准XML配置文件,这里的部分练习是看我如何构建自己的基于JSP的项目。

我得到的例外情况如下:

  ERROR [[jsp]] Servlet.service() for servlet jsp threw exception: java.lang.NullPointerException
    at javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1858) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
    at org.apache.jsp.main_jsp._jspx_meth_f_005fview_005f0(main_jsp.java:99)
    at org.apache.jsp.main_jsp._jspService(main_jsp.java:76)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [jbossweb-7.0.13.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) [jbossweb-7.0.13.Final.jar:]
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jbossweb-7.0.13.Final.jar:]
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) [jbossweb-7.0.13.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:397) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Thread.java:636) [rt.jar:1.6.0_18]

我没有给出任何JBoss配置文件,WAR的WEB-INF部分如下所示:

$ jar tvf build/lib/dukebank-web.war 
     0 Sat Dec 15 22:00:12 GMT 2012 META-INF/
   123 Sat Dec 15 22:00:10 GMT 2012 META-INF/MANIFEST.MF
     0 Sat Dec 15 22:00:12 GMT 2012 WEB-INF/
  2514 Fri Dec 14 14:29:20 GMT 2012 WEB-INF/web.xml
  1348 Sat Dec 15 08:19:46 GMT 2012 WEB-INF/dukesBank.tld
  7245 Sat Dec 15 08:19:46 GMT 2012 WEB-INF/faces-config.xml
  2153 Sat Dec 15 08:19:46 GMT 2012 WEB-INF/tutorial-template.tld
     0 Sat Dec 15 22:00:12 GMT 2012 WEB-INF/classes/...

导致此问题的JSP文件(main.jsp)是:

<f:view>
    <h:form>
        <jsp:include page="/template/template.jsp"/>
        <center>
            <h3><h:outputText value="#{bundle.Welcome}"/></h3>
        </center>
    </h:form>
</f:view>

它包含的模板文件:

<%@ taglib uri="/WEB-INF/tutorial-template.tld" prefix="tt" %>
<%@ page errorPage="/template/errorpage.jsp" %>
<%@ include file="/template/screendefinitions.jspf" %>
<html>
<head>
<title>
  <tt:insert definition="bank" parameter="title"/>
</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>
<body bgcolor="#ffffff">
  <tt:insert definition="bank" parameter="banner"/>
  <tt:insert definition="bank" parameter="links"/>
</body>
</html>

我将不再处理任何文件,因为正如我在开始时说的那样,我没有改变我使用过的任何文件。

非常感谢你的帮助, 史蒂夫

1 个答案:

答案 0 :(得分:2)

Duke的Bank示例基于JSF,它是一个基于组件的MVC框架,以前曾用JSP作为“View”。 JSF页面应该由一个URL打开,该URL与web <url-pattern>中定义的FacesServlet的{​​{1}}相匹配。例如,如果它是web.xml,那么您应该按*.jsf而不是main.jsf打开它。或者如果它是main.jsp,则应该/faces/*而不是faces/main.jsp打开它。这将调用main.jsp,而FacesServlet将创建FacesContext并完成所有JSF的工作。

你在那条线上得到一个NPE,因为<f:view>(由堆栈跟踪中的行at org.apache.jsp.main_jsp._jspx_meth_f_005fview_005f0(main_jsp.java:99)表示)试图找到JSF的FacesContext,但是可以'似乎找到一个。这是事实,因为FacesContext应该由FacesServlet创建。

另见:


无关具体问题:遗留Java EE 5教程不适合阅读JBoss 7. JBoss 7是一个兼容Java EE 6的现代容器。 Since Java EE 6, JSP is deprecated as JSF view technology and succeeded by Facelets. Also, JSF 1.x (part of Java EE 5) is really not what you would like to use these days, you should be heading to JSF 2.x (part of Java EE 6)