首次导航到页面时,“找不到标签”异常

时间:2013-01-16 16:16:43

标签: templates jsf composite-component

我在我们的应用程序中遇到以下问题:在每次服务器重新启动或重新部署应用程序后,首次尝试导航到一个特定页面将失败,但有例外:

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或通过网址
  • 在目标页面成功到达一次后

我排除了各种各样的事情(我们在Mojarra 2.1.7并且目标页面没有嵌套组件,所以nested namespace declarations不是这个问题)并将其缩小到以下“罪魁祸首” :

源页面使用模板,我简化如下:

<!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。

1 个答案:

答案 0 :(得分:0)

花了很长时间,但我们终于成功升级了。我们现在正在运行Mojarra 2.1.21。

我重新启用了include,并尝试尽可能恢复原始设置。我没有得到任何错误。代码在其他地方也发生了变化,所以我不能绝对肯定地说这是它起作用的唯一原因。然而,最初的问题是相当可重复的,并且一般设置与以前基本相同,所以我很确定其中许多跳过Mojarra版本中的一个就行了。