アプリケーションで次の問題が発生しました。サーバーを再起動するか、アプリケーションを再デプロイするたびに、特定の1つのページに移動しようとすると、例外が発生して失敗します。
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です。