我在使用<ui:include>
标记内的复合组件的页面上遇到了一个奇怪的错误。我有一个单页testCC.xhtml,其中包含以下内容:
<ui:include>
指向testCC_inc.xhtml文件,该文件本身包含复合组件。<h:inputText>
在其中一个属性中包含一个包含facelet函数的<f:validate>
标记。当呈现页面时,我得到以下异常“函数'fn:plusOne'未找到”。有趣的是当我尝试改变页面中的内容时:
<ui:include>
之后移动<h:inputText>
代码:工作正常。<h:inputText>
的value属性中移动facelet函数调用(并使用<f:validate>
中的litteral替换该函数):工作正常。在调试EL(= jasper-el,因为我在tomcat上)和facelets taglib时,我注意到失败的情况和上面的一个工作情况之间的一个主要区别:在尝试解决facelet函数时,要查看的可用命名空间的映射是来自包含文件的映射!!但是,将主页面中的命名空间添加到包含的页面中并没有解决我的问题。
我的页面/配置确实遗漏了某些内容或做错了什么,但无法理解。
我的配置
web.xml仅包含映射到* .xhtml的FacesServlet +以下context-params:
http://my.company.com/functions
并包含facelet函数int plusOne(int)
。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>
答案 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。