【问题标题】:NullPointerException in generated JSP code calling setJspId()生成的 JSP 代码调用 setJspId() 中的 NullPointerException
【发布时间】:2012-12-16 06:06:26
【问题描述】:

我正在尝试从 JBoss 7.1.1 上的 Java EE 5 教程中部署 Duke's 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>

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

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

【问题讨论】:

  • 在编译的 JSP 文件 main_jsp.java 中检查第 99 行和第 76 行,bundle 很可能为空
  • @alfasin:这不可能产生这个堆栈跟踪。 #{} 是 EL (javax.el),它根本不会出现在跟踪中,它本身也是“空安全的”。
  • @BalusC 他不能在该行之前添加类似:&lt;%="bundle = "+bundle%&gt; 吗?
  • @alfasin:我不确定这样做对这个特定问题有什么帮助。如果您有兴趣,我建议您花一些时间学习 JSF/JSP。
  • @BalusC 如果bundle 为空,那么bundle.Welcome 将抛出NullPointerException - 不是吗?无论如何,通过查看编译的 JSP 文件 main_jsp.java 中的第 99 行,您应该能够发现 NPE 是因为 FacesContext (就像您在回答中写的那样),这是我的第一个建议...

标签: jsp jboss nullpointerexception


【解决方案1】:

Duke's Bank 示例基于JSF,这是一个基于组件的MVC 框架,以前使用JSP 作为“视图”。 JSF 页面应该由与 FacesServlet&lt;url-pattern&gt; 匹配的 URL 打开,如 webapp 的 web.xml 中定义的那样。例如,如果是*.jsf,那么您应该使用main.jsf 而不是main.jsp 打开它。或者如果它是/faces/*,那么你应该用faces/main.jsp而不是main.jsp打开它。这将调用FacesServlet,而FacesContext 又会创建FacesContext 并执行所有JSF 工作。

因为&lt;f:view&gt;(由堆栈跟踪中的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).

【讨论】:

  • 非常感谢您的帮助。我已经准备好放弃我的示例,转而支持 Java EE 6 教程,如果正如您所指出的那样,它是一种更新的做事方式。归根结底,我只想学习一种合适的基于 Java 的服务器技术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多