Использование нового пространства имен 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

После того, как я набрал код примера в главе 8.5 Составные компоненты в моей 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 от http://javaserverfaces.java.net/. Все, что вам нужно сделать, это заменить javax.faces.jar файл в GlassFish's /modules папка с более новой версией.

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

Другие вопросы по тегам