1

アプリケーションで次の問題が発生しました。サーバーを再起動するか、アプリケーションを再デプロイするたびに、特定の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です。

4

1 に答える 1

0

かなり時間がかかりましたが、ようやくアップグレードできました。現在、Mojarra2.1.21を実行しています。

インクルードを再度有効にして、可能な限り元の設定を復元しようとしました。エラーは発生しませんでした。他の場所でもコードが変更されているので、これが機能する唯一の理由であるとは絶対に言えません。ただし、元の問題は非常に再現性があり、一般的な設定は基本的に以前と同じであるため、スキップされた多くのMojarraバージョンの1つでうまくいったと確信しています。

于 2013-06-04T18:13:03.610 に答える