Использование нового пространства имен xmlns.jcp.org в композитах вызывает java.lang.NullPointerException в java.util.concurrent.ConcurrentHashMap.putIfAbsent

Я читаю учебное пособие по Java EE 7 из http://docs.oracle.com/javaee/7/tutorial/doc/jsf-facelets005.htm#GIQZR

После того, как я набрал код примера в главе 8.5 Composite Components в моей среде IDE и запустил пример на GlassFish4.0, я получил сообщение об ошибке

java.lang.NullPointerException
    at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1078)
    at com.sun.faces.util.Cache.get(Cache.java:116)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.getComponentMetadata(FaceletViewHandlingStrategy.java:237)
    at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:951)
    at javax.faces.application.ApplicationWrapper.createComponent(ApplicationWrapper.java:648)

Затем я проверяю более старую версию этого руководства, я нашел разницу.

В версии Java EE 7 код email.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:composite="http://xmlns.jcp.org/jsf/composite"
  xmlns:h="http://xmlns.jcp.org/jsf/html">

<h:head>
    <title>This content will not be displayed</title>
</h:head>
<h:body>
    <composite:interface>
        <composite:attribute name="value" required="false"/>
    </composite:interface>

    <composite:implementation>
        <h:outputLabel value="Email id: "></h:outputLabel>
        <h:inputText value="#{cc.attrs.value}"></h:inputText>
    </composite:implementation>
</h:body>
</html>

Но в версии Java EE 6

<!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:composite="http://java.sun.com/jsf/composite"
  xmlns:h="http://java.sun.com/jsf/html">

<h:head>
    <title>This content will not be displayed</title>
</h:head>
<h:body>
    <composite:interface>
        <composite:attribute name="value" required="false"/>
    </composite:interface>

    <composite:implementation>
        <h:outputLabel value="Email id: "></h:outputLabel>
        <h:inputText value="#{cc.attrs.value}"></h:inputText>
    </composite:implementation>
</h:body>
</html>

После того, как я изменил код на версию Java EE 6, ошибка исчезла. Разница - пространство имен. Я не знаю, является ли это проблемой этого урока. Кто-нибудь знает?

Ответ 1

Способ, которым обрабатываются новые пространства имен xmlns.jcp.org XML, нарушен в первых выпусках Mojarra 2.2.0 и 2.2.1. Он зафиксирован в Mojarra 2.2.2 (примечание: билет в ссылке описывает различный проблемный симптом, но под обложками это по сути та же причина). Рекомендуется обновить, по крайней мере, до Mojarra 2.2.2 (всегда выбирайте самые новые доступные, если это возможно). GlassFish 4.0 имеет пакет 2.2.0. Вы можете получить JAR из javaserverfaces.java.net. Все, что вам нужно сделать, это заменить файл javax.faces.jar в папку GlassFish /modules на более новую версию.

Учебник Java EE 7 в порядке. Это была просто нарушена реализация. Подобная проблема, кстати, не необычна с первым выпуском GlassFish (все хотят довести его до готовности). Я рекомендую подождать с Java EE 7 до появления GlassFish 4.0.1 или 4.1, чтобы избежать будущих сюрпризов. Обратите внимание, что другие производители, такие как Apache Tomcat и JBoss AS, не спешат выпускать контейнер Java EE 7; у них еще нет готовой версии.