NullPointerException в сгенерированном коде JSP, вызывающем setJspId()

Я пытаюсь развернуть пример Duke's Bank из учебника по Java EE 5 на JBoss 7.1.1. Я использовал только (без изменений) исходный код и стандартные файлы конфигурации 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, WEB-INF часть WAR выглядит так:

$ 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>

Я воздержусь от копирования каких-либо других файлов, потому что, как я сказал в начале, я не изменил ни один из файлов, которые использовал.

Большое спасибо за помощь, Стив


person Dobbo    schedule 16.12.2012    source источник
comment
Строки проверки 99 и 76 в скомпилированном файле JSP main_jsp.java скорее всего bundle равны нулю   -  person Nir Alfasi    schedule 16.12.2012
comment
@alfasin: это может привести к невозможности создания этой трассировки стека. #{} вещи - это EL (javax.el), которые вообще не появляются в трассировке и которые сами по себе также нуль-безопасны.   -  person BalusC    schedule 16.12.2012
comment
@BalusC Не может ли он добавить перед этой строкой что-то вроде: <%="bundle = "+bundle%>?   -  person Nir Alfasi    schedule 16.12.2012
comment
@alfasin: я не уверен, как это поможет в этом конкретном вопросе. Я рекомендую потратить некоторое время на изучение JSF/JSP, если вам это интересно.   -  person BalusC    schedule 16.12.2012
comment
@BalusC, если bundle равно нулю, то bundle.Welcome выдаст NullPointerException - нет? в любом случае, просмотрев строку 99 в скомпилированном файле JSP main_jsp.java, вы сможете обнаружить, что NPE возникает из-за FacesContext (как вы написали в своем ответе), что было моим первым предложением...   -  person Nir Alfasi    schedule 16.12.2012
comment
@alfasin: вы, видимо, никогда раньше не использовали EL. Ответ на конкретный вопрос ОП уже дан ниже.   -  person BalusC    schedule 16.12.2012


Ответы (1)


Пример Duke's Bank основан на JSF, который представляет собой структуру MVC на основе компонентов, которая ранее использовалась для использования JSP в качестве представления. Предполагается, что страницы JSF открываются по URL-адресу, который соответствует <url-pattern> из FacesServlet, как определено в 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) в трассировке стека) пытается найти FacesContext JSF, но, похоже, не может его найти. Это правда, поскольку FacesContext должен быть создан FacesServlet.

Смотрите также:


Не имеет отношения к конкретной проблеме: устаревшее руководство по Java EE 5 не подходит для чтения по JBoss 7. JBoss 7 — это современный контейнер, совместимый с Java EE 6. Начиная с Java EE 6, JSP устарела как технология представления JSF и заменена Facelets. Кроме того, JSF 1.x (часть Java EE 5) на самом деле не то, что вы хотели бы использовать в наши дни, вы должен перейти на JSF 2.x (часть Java EE 6).

person BalusC    schedule 16.12.2012
comment
Большое спасибо за вашу помощь. Я вполне готов отказаться от своего примера в пользу учебника по Java EE 6, если, как вы указываете, это более новый способ ведения дел. В конце концов, все, что я хочу, это изучить соответствующую серверную технологию на основе Java. - person Dobbo; 17.12.2012