在composites上使用新的xmlns.jcp.org命名空间会导致java.util.concurrent.ConcurrentHashMap.putIfAbsent上的java.lang.NullPointerException

Chr*_*ris 6 jsf facelets xml-namespaces composite-component jsf-2.2

我正在阅读http://docs.oracle.com/javaee/7/tutorial/doc/jsf-facelets005.htm#GIQZR上的Java EE 7教程

在我的IDE中的8.5复合组件一章中键入示例代码并在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)
Run Code Online (Sandbox Code Playgroud)

然后我查看本教程的旧版本,我发现了一个区别.

在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>
Run Code Online (Sandbox Code Playgroud)

但是在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>
Run Code Online (Sandbox Code Playgroud)

将代码更改为Java EE 6版本后,错误消失了.名称空间不同.我不知道这是否是本教程的问题.有没有人知道?

Bal*_*usC 9

xmlns.jcp.org一个Mojarra版本2.2.0和2.2.1中打破了处理新XML命名空间的方式.它已在Mojarra 2.2.2修复(注意:链接中的票据描述了不同的问题症状,但在幕后,它基本上是相同的原因).建议至少升级到Mojarra 2.2.2(如果可能的话,总是选择最新的).GlassFish 4.0捆绑了2.2.0.您可以从javaserverfaces.java.net获取JAR .您需要做的就是用更新的版本替换javax.faces.jarGlassFish /modules文件夹中的文件.

Java EE 7教程本身很好.只是实施被打破了.这种麻烦在第一个主要的GlassFish发布版本中并不罕见(所有这些都是准时准备好的).我建议等待使用Java EE 7,直到GlassFish 4.0.1或4.1已经出现,以避免将来出现意外.请注意,Apache Tomcat和JBoss AS等其他供应商会花时间发布Java EE 7容器.他们还没有生产就绪版本.

  • 我能够在未经修改的GF4设置上重现您的问题.在我使用Mojarra 2.2.2升级后,您的用例开始为我工作.你清理GF4工作/缓存/部署文件夹了吗?你是如何管理服务器的?独立还是通过IDE?请注意,如果我自己也没有确认/经历过这个问题,我通常不会发布答案. (2认同)