【问题标题】:Facelet function not found when using a composite component inside a <ui:include>在 <ui:include> 中使用复合组件时找不到 Facelet 函数
【发布时间】:2013-12-06 01:24:19
【问题描述】:

我在处理使用&lt;ui:include&gt; 标记内的复合组件的页面时遇到了一个奇怪的错误。我有一个单页testCC.xhtml,内容如下:

  1. &lt;ui:include&gt; 指向一个 testCC_inc.xhtml 文件,该文件本身包含一个复合组件。
  2. &lt;h:inputText&gt; 包装了一个 &lt;f:validate&gt; 标记,该标记在其属性之一中包含一个 facelet 函数。

呈现页面时,我收到以下异常“未找到函数 'fn:plusOne'”。有趣的是,当我尝试更改页面中的内容时:

  1. 移动&lt;ui:include&gt;标签之后 &lt;h:inputText&gt;:工作正常。
  2. 在 &lt;h:inputText&gt; 的 value 属性中移动 facelet 函数调用(并用 &lt;f:validate&gt; 中的文字替换函数):工作正常。
  3. 从包含的页面中删除复合组件:工作正常。

在调试 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 + 以下上下文参数:

  • javax.faces.FACELETS_REFRESH_PERIOD = 1
  • javax.faces.FACELETS_SKIP_COMMENTS = 假
  • 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 = 假
  • javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL = true

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

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

没有第三方 JSF 库。

文件

webapp/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>

webapp/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>

webapp/resources/test/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>

【问题讨论】:

  • 如果将xmlns:fn 重新声明为&lt;cc:implementation xmlns:fn="..."&gt; 会怎样?如果可行,您能否重新验证您是否真的在运行 Mojarra 2.1.21?这个问题应该已经在 2.1.10 中修复了。不管怎样,目前已经是 2.1.26,所以升级还是值得的。
  • 感谢您的回复。在 中添加命名空间声明解决了这个问题,我真的在使用 2.1.21。从 2.1.22 开始,即使没有命名空间声明,错误也会消失。所以,我将使用 2.1.22+,大概是最新的。非常感谢。
  • 我建议跳过 2.1.22 - 2.1.25,这些版本在状态保存、闪存范围、c:forEach 和 ui:repeat 方面存在几个主要问题。
  • 你拯救了我的一天。非常感谢。

标签: jsf-2 facelets composite-component


【解决方案1】:

这可以识别为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。

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 2012-04-20
    • 2014-09-04
    • 2014-12-11
    • 2011-10-12
    • 2011-03-22
    相关资源
    最近更新 更多