【发布时间】:2013-12-06 01:24:19
【问题描述】:
我在处理使用<ui:include> 标记内的复合组件的页面时遇到了一个奇怪的错误。我有一个单页testCC.xhtml,内容如下:
-
<ui:include>指向一个 testCC_inc.xhtml 文件,该文件本身包含一个复合组件。 -
<h:inputText>包装了一个<f:validate>标记,该标记在其属性之一中包含一个 facelet 函数。
呈现页面时,我收到以下异常“未找到函数 'fn:plusOne'”。有趣的是,当我尝试更改页面中的内容时:
- 移动
<ui:include>标签之后<h:inputText>:工作正常。 - 在
<h:inputText>的 value 属性中移动 facelet 函数调用(并用<f:validate>中的文字替换函数):工作正常。 - 从包含的页面中删除复合组件:工作正常。
在调试 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重新声明为<cc:implementation xmlns:fn="...">会怎样?如果可行,您能否重新验证您是否真的在运行 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