在<ui:include> </ui:include>中使用复合组件时找不到Facelet函数

时间:2013-11-21 14:14:44

标签: jsf-2 facelets composite-component

我在使用<ui:include>标记内的复合组件的页面上遇到了一个奇怪的错误。我有一个单页testCC.xhtml,其中包含以下内容:

  1. <ui:include>指向testCC_inc.xhtml文件,该文件本身包含复合组件。
  2. <h:inputText>在其中一个属性中包含一个包含facelet函数的<f:validate>标记。
  3. 当呈现页面时,我得到以下异常“函数'fn:plusOne'未找到”。有趣的是当我尝试改变页面中的内容时:

    1. <ui:include>之后移动<h:inputText>代码:工作正常。
    2. <h:inputText>的value属性中移动facelet函数调用(并使用<f:validate>中的litteral替换该函数):工作正常。
    3. 从包含的页面中删除复合组件:工作正常。
    4. 在调试EL(= jasper-el,因为我在tomcat上)和facelets taglib时,我注意到失败的情况和上面的一个工作情况之间的一个主要区别:在尝试解决facelet函数时,要查看的可用命名空间的映射是来自包含文件的映射!!但是,将主页面中的命名空间添加到包含的页面中并没有解决我的问题。

      我的页面/配置确实遗漏了某些内容或做错了什么,但无法理解。

      我的配置

      • jdk 1.7.0_25
      • tomcat 7.0.41,系统属性为org.apache.el.parser.COERCE_TO_ZERO = false
      • mojarra 2.1.21

      web.xml仅包含映射到* .xhtml的FacesServlet +以下context-params:

      • javax.faces.FACELETS_REFRESH_PERIOD = 1
      • javax.faces.FACELETS_SKIP_COMMENTS = false
      • javax.faces.FACELETS_LIBRARIES = /WEB-INF/taglibs/functions.taglib.xml。声明名称空间http://my.company.com/functions并包含facelet函数int plusOne(int)
      • 的文件
      • javax.faces.PROJECT_STAGE =发展
      • javax.faces.VALIDATE_EMPTY_FIELDS = false
      • javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL = true

      faces-config.xml为空,没有加载其他配置文件。

      没有托管bean,组件或任何带注释的类。

      没有第三方JSF库。

      文件

      web应用程序/ testCC.xhtml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE html>
      <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:fn="http://my.company.com/functions">
      <f:view>
        <h:head>
          <meta http-equiv="cache-control" content="no-cache" />
        </h:head>
        <h:body>
          <h:form id="f">
            <h1>Test CC</h1>
            <ui:include src="testCC_inc.xhtml"/>
            <h:inputText id="inputText">
              <f:validateLength maximum="#{fn:plusOne(42)}" />
            </h:inputText>
          </h:form>
        </h:body>
      </f:view>
      </html>
      

      web应用程序/ testCC_inc.xhtml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE html>
      <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:mycc="http://java.sun.com/jsf/composite/test">
      <ui:composition>
         <mycc:dummycc echo="OK"/>
      </ui:composition>
      </html>
      

      web应用程序/资源/测试/ dummycc.xhtml

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE html >
      <html xmlns="http://www.w3.org/1999/xhtml" 
        xmlns:cc="http://java.sun.com/jsf/composite"
        xmlns:h="http://java.sun.com/jsf/html">
        <h:head/>
        <h:body>
          <cc:interface>
            <cc:attribute name="echo" required="true"/>
          </cc:interface>
          <cc:implementation>
            #{cc.attrs.echo}
          </cc:implementation>
        </h:body>
      </html>
      

1 个答案:

答案 0 :(得分:0)

这可以识别为Mojarra issue 2437,可以通过在复合实现中重新声明XML命名空间来解决这个问题,如下所示:

<cc:implementation xmlns:fn="http://my.company.com/functions">

但是,这个问题已在Mojarra 2.1.10中修复,但您提到您使用的是2.1.21。我会重新验证您是否真正运行Mojarra 2.1.21或者至少将其升级到当前最新版本2.1.26。