我在应用程序中遇到了以下问题:每次服务器重新启动或重新部署应用程序后,第一次尝试导航到一个特定页面将失败,并出现异常:
javax.faces.view.facelets.TagException: /testing/target.xhtml @8,72 <ofc:testComp> Tag Library supports namespace: http://java.sun.com/jsf/composite/of-components, but no tag was defined for name: testComp
我花了好长时间才把它简化成一个最小的版本。在这样做的过程中,我发现了以下内容:
问题发生在:
- 服务器已重新启动或应用程序已重新部署
- 用户试图通过
h:commandLink
导航到某个页面目标页面使用复合组件
当:
- 以其他方式到达目标页面,例如通过
h:outputLink
或通过URL - 在成功到达目标页面一次之后
我排除了各种各样的事情(我们在Mojarra 2.1.7和目标页面没有嵌套组件,所以这不是嵌套命名空间声明的问题),并将其缩小到以下"罪魁祸首":
源页面使用一个模板,我将其简化如下:
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Testpage</title>
</h:head>
<h:body>
<h:form id="form">
<ui:insert name="content"/>
<ui:include src="some_other_content.xhtml" />
</h:form>
</h:body>
</html>
如果我删除ui:include
一切工作。有人能给我解释一下这是怎么回事吗?它似乎与服务器重启后初始化我的组件库有关,但我不知道模板中的包含与此有关。据我所知,这是标准的方式,包括一些固定的内容到一个页面?如果不能这样做,请让我知道还有什么其他的方法。
谢谢!
完整的剩余代码片段(这里没有魔法发生):
source_page.xhtml
<ui:composition template="/testing/test_template.xhtml">
<ui:define name="content">
<h:outputLink value="target.xhtml">Outputlink to target</h:outputLink> <br />
<h:commandLink value="Commandlink to target" action="target.xhtml" />
</ui:define>
</ui:composition>
target.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:ofc="http://java.sun.com/jsf/composite/of-components"
xmlns:h="http://java.sun.com/jsf/html">
<h:head></h:head>
<h:body>
<ofc:testComp content="This is a component for testing purposes" />
</h:body>
</html>
testComp.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="content" required="true" />
</cc:interface>
<cc:implementation>
<h:outputText value="#{cc.attrs.content}" />
</cc:implementation>
</html>
最后,some_other_content.xhtml只是一个随机的Hello-World-Page
虽然花了不少时间,但我们最终还是成功升级了。我们现在运行Mojarra 2.1.21。
我重新启用了包含,并试图尽可能地恢复原来的设置。我没有得到任何错误。代码在其他地方也改变了,所以我不能绝对肯定地说这是它工作的唯一原因。然而,最初的问题是相当可重复的,一般设置基本上和以前一样,所以我很确定那些跳过的Mojarra版本之一做到了这一点。