2017-03-17 20 views
1

を使用しているとき、私はこのレンダリング/コンパイル時の問題を認識してんだけど、私は本当に以下の例が動作しない理由見当もつかない <c:if> と条件付き複合コンポーネントを使用しているとき、私は重複したIDの例外を取得。本当に 重複ID例外複合コンポーネントと

@Named 
@SessionScoped 
public class TestBean implements Serializable { 

    private boolean isVisible = false; 

    public void onSetItemVisible(AjaxBehaviorEvent e) { 
     this.isVisible = true; 
    } 

    public void onSetItemInvisible(AjaxBehaviorEvent e) { 
     this.isVisible = false; 
    } 

    public boolean isItemVisible() { 
     return this.isVisible; 
    } 
} 

A: 以下の3つの簡単なスニペット

を見てくださいセッションは、ブール値trueまたはfalseに、この値を変更する2人のAJAXのリスナーを保持しているTestBeanという名前のBeanをスコープtestCmpという名前の単純な複合コンポーネント:

<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:implementation> 
     <h:outputText id="text" value="text"/> 
    </cc:implementation> 
</html> 

そして非表示/笙を切り替えることができますビューページこの複合コンポーネントで

事は:私は重複したIDを取得私は表示/非表示を切り替えると例外です。 例外は言う:「コンポーネントID TESTFORM:TEST2:テキストはすでにビューで発見された」

それは「TEST2」...条件付きで追加されていないコンポーネントについて不平を言います。 私はコンポジットコンポーネントを使用せず、<h:outputText>のような標準コンポーネントと置き換えると、何かうまく動作します。 エラーを再現するには、コンポジットコンポーネントが同じページで2回使用されていることが重要です。

さらに検索した後、私は私のような同じ問題があると思う別の人を見つけました。しかし、彼の例はもう少し複雑に見え、再現するのは難しいです。 Duplicate component ID in JSF using composite component twice in view

ここで何が起こっているのですか? Mojarra JSF 2.2.14を使用したJBoss EAP7です(ただし、JSF 2.3.0-m11でもテスト済み) 誰かがこの問題を確認できますか? もしそうなら、私はmojarrayの人のためのバグを作ります。

+0

この動作を確認できる人はいませんか? 現在のjsf実装のバグであれば、私はそれを使用しても構いませんが、jira bugtrackerには何も見つかりませんでしたが、私は何か間違っているのか、JSFの基本を誤解しているのか分かりません。 – fmueller19

+0

私はここにバグを作成しました:https://java.net/jira/browse/JAVASERVERFACES-4240 – fmueller19

+0

これはgithubに移動されました:https://github.com/javaserverfaces/mojarra/issues/4244 –

答えて

1

これは間違いなくMojarraのバグであり、状況によっては動的コンポーネントツリーの変更を処理することに関連しています。

私は再生器を作成し、問題を提起し、mojarra devメーリングリストに調査結果を書いています。 https://github.com/tuner/mojarra-dynamic-include-reproducer

1

<c:if><cc:implementation>の内部で使用した場合、同じ問題が発生しました。 私が見つけたこのバグを回避する唯一の方法は、<c:if test="#{condition}">の代わりに<h:panelGroup rendered="#{condition}">を使用していました。

関連する問題