Ошибка аргумента NPE: значение параметра равно нулю (JSF), только когда <h: head> находится на странице - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть страница jsf, main.xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

<ui:composition template="WEB-INF/templates/layout.xhtml">
    <ui:define name="title">Page Title</ui:define>
...

Layout.xml выглядит следующим образом:

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">
<h:head>
    <title><ui:insert name="title">Default Title</ui:insert></title>
    <h:outputStylesheet library="theme" name="main.css" />
</h:head>

<h:body>

<div id="header">
    <ui:insert name="header">
        <ui:include src="header.xhtml"/>
    </ui:insert>
    <ui:insert name="toolbar">
         <ui:include src="toolbar.xhtml" />
    </ui:insert>
</div>


<div id="content">
    <br/>
    <ui:insert name="content">
        TBD
    </ui:insert>
</div>

<div id="footer">
    <ui:insert name="footer">
        <ui:include src="footer.xhtml"/>  
    </ui:insert>
</div>

</h:body>

</html>

Когда я пытаюсь загрузить страницу, я получаю следующеетрассировка стека:

Dec 8, 2011 8:58:50 AM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/main.xhtml]
java.lang.NullPointerException: Argument Error: Parameter value is null
    at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.writeURIAttribute(HtmlResponseWriter.java:985)
    at com.sun.faces.renderkit.html_basic.StylesheetRenderer.encodeEnd(StylesheetRenderer.java:108)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at com.sun.faces.renderkit.html_basic.HeadRenderer.encodeHeadResources(HeadRenderer.java:105)
    at com.sun.faces.renderkit.html_basic.HeadRenderer.encodeEnd(HeadRenderer.java:92)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.lmig.cm.ps.editor.filter.SecuredPageFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.lmig.cm.ps.editor.user.UserFilter.handleDeveloperEnvironment(Unknown Source)
    at com.lmig.cm.ps.editor.user.UserFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.lmig.cm.ps.editor.filter.SessionTimeoutFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)

Если я удаляю раздел из layout.xhtml:

<h:head>
    <title><ui:insert name="title">Default Title</ui:insert></title>
    <h:outputStylesheet library="theme" name="main.css" />
</h:head>

Страница будет загружена (конечно, без CSS или заголовка).Даже если у меня есть только это на странице:

<h:head>
</h:head>

Это не будет отображаться, и я получаю ту же ошибку.

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

У кого-нибудь есть идеи?

1 Ответ

2 голосов
/ 08 декабря 2011
java.lang.NullPointerException: Argument Error: Parameter value is null 
    at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.writeURIAttribute(HtmlResponseWriter.java:985)
    at com.sun.faces.renderkit.html_basic.StylesheetRenderer.encodeEnd(StylesheetRenderer.java:108)

Давайте посмотрим на источник StylesheetRenderer#encodeEnd() (я использую Mojarra 2.1.4; я предполагаю, что вы также используете его, поскольку большинство, если не все com.sun.faces номера строк в трассировке стека соответствуют 100%с источником, однако в будущем, пожалуйста, укажите точную версию):

105    String resourceUrl = "RES_NOT_FOUND";
105    if (resource != null) {
106        resourceUrl = context.getExternalContext().encodeResourceURL(resource.getRequestPath());
107    }
108    writer.writeURIAttribute("href", resourceUrl, "href");

Итак, resourceUrl - это null как-то.

Давайте посмотрим на ExternalContext#encodeResourceURL(String) источник:

311     public abstract String encodeResourceURL(String url);

Да, это абстракция.Что ж, давайте посмотрим на реализацию Mojarra по умолчанию, com.sun.faces.context.ExternalContextImpl:

521     public String encodeResourceURL(String url) {
522         return ((HttpServletResponse) response).encodeURL(url);
523     }

Ах, он делегирует HttpServletResponse#encodeURL(), который по умолчанию вообще не должен возвращать null.

Итак, ваша проблема может иметь как минимум 2 возможные причины:

  • У вас есть пользовательская реализация ExternalContext, которая не выполняет свою работу в encodeResourceURL() должным образом.
  • У вас есть пользовательская реализация HttpServletResponseWrapper, которая не выполняет свою работу в encodeURL() должным образом.

Установка точки останова отладчика в строке 106 из StylesheetRenderer и отладка оттуда должны сообщить вамкакие реализации на самом деле использовались.

То же исключение возникает при удалении <h:outputStylesheet>, вероятно, потому что RichFaces неявно вставляет туда эти компоненты, а также для собственных таблиц стилей.Основываясь на ваших декларациях пространства имен XML, вы используете RichFaces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...