0

複合コンポーネントを使用するときにバッキング Bean プロパティを設定しようとしています (バッキング Bean はコンポジットattributeです)。

finalDraft条件付きで属性を入力したいBean プロパティ (例: ) があります (属性は必須ではないため、条件付きで)。

バッキング Bean:

class Bean ... {
   String finalDraft; // getters+setters

   @PostConstruct
   void init() {
       String draftAttr = (...) getAttributes("draft");
       if(draftAttr!=null) {
           finalDraft = draftAttr;
       }
   }
}

コンポジット:

<composite:interface>
    <composite:attribute name="bean" required="true" ... />
    <composite:attribute name="draft" type="java.lang.String" />
</composite:interface>

これまでのところ、 ofgetAttributes("draft")内で試してみましたが、null に解決されます (メモ: view-scope)。@PostConstructbean

これを行う他の方法はありますか?

4

1 に答える 1

1

Bean を複合コンポーネントにバインドしないでください。代わりにプロパティを直接渡します。

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:h="http://java.sun.com/jsf/html">
    <h:body>
        <composite:interface>
            <composite:attribute name="showDraft" default="true" />
            <composite:attribute name="draft" />
        </composite:interface>
        <composite:implementation>
            <h:inputText value="#{cc.attrs.draft}" 
                rendered="#{cc.attrs.showDraft}" />
        </composite:implementation>
    </h:body>
</html>

その後、メインページで次のいずれかで使用できます。

<comp:draftInput value="#{bean.finalDraft}" />

また

<comp:draftInput showDraft="false" />

ここでバッキング Bean について混乱していると思います。1 つは現在の@ViewScopedBean にあるもので、もう 1 つは複合コンポーネントです。コンポジットは、現在のビューのマネージド Bean について何も認識せず、パラメーターを受け取って表示するだけです。それは、単一の facelet ビューである場合もあれば、コンポジットについてのみ認識し、スコープについては何も認識しないクラスを背後に持つ場合もあります。

于 2014-09-10T14:42:45.250 に答える