0

複合コンポーネントに問題があります。

このコンポーネントは、インターフェース宣言の componentType 属性を使用して、コンポーネント (およびその属性) をバッキング Bean にバインドします。

これは、複合コンポーネントの属性が更新されない限り機能します。

ログをよく見ると、バッキング Bean の属性は常に属性の初期値で更新されているようです。

私のxhtmlコンポーネントは次のようになります:

<composite:interface componentType="timelineMandats">
    <composite:attribute name="augmentedSen" type="fr.senat.beans.AugmentedSen" required="true"/>
    <composite:attribute name="timelineWidth" required="false" default="800"/>
    <composite:attribute name="dateMin" required="false" type="java.util.Date"/>
    <composite:attribute name="dateMax" required="false" type="java.util.Date"/>
    <composite:attribute name="highlightDate" required="false" type="java.util.Date"/>
    <composite:attribute name="forceMinMax" required="false" default="false"/>
  </composite:interface>
  <composite:implementation>
<p:outputPanel>
    <p:scrollPanel style="width:820px; height:200px;text-align:center;">
      <p:graphicImage id="imgTimeline" value="#{cc.timelineSenatoriaux}"/>  
    </p:scrollPanel>
    <p:panelGrid columns="4">
      <h:outputText value="Intervalle :"/>

      <p:calendar value="#{cc.dateMin}" pattern="dd/MM/yyyy" mode="popup" showOn="button">
    <p:ajax event="dateSelect" update="imgTimeline"/>
    <p:ajax event="change" update="imgTimeline"/>
      </p:calendar>

      <p:calendar value="#{cc.dateMax}" pattern="dd/MM/yyyy" mode="popup" showOn="button">
    <p:ajax event="dateSelect" update="imgTimeline"/>
    <p:ajax event="change" update="imgTimeline"/>
      </p:calendar>

      <p:commandButton value="Mettre à jour" update="imgTimeline"/>
    </p:panelGrid>
</p:outputPanel>
  </composite:implementation>

バッキング Bean は次のように宣言されます。

@FacesComponent("timelineMandats")
public class TimelineMandats extends TimelineBase {

AugmentedSen asen;

public AugmentedSen getAugmentedSen() { return asen; }
public void setAugmentedSen(AugmentedSen asen) { this.asen = asen; }
// other accessors and stuff
}

その基本クラスは UIComponentBase から派生し、 NamingContainer を拡張します。

public class TimelineBase extends UIComponentBase implements Serializable,NamingContainer {
...
}

UINamingContainer、UIComponentなどからの派生も試みました。

「AugmentedSen」タイプはシリアライズ可能で、他の多くの場所で使用されています。

複合コンポーネントは、いくつかのパラメーターとして el 式を使用して呼び出されます。

<sen:timelineMandatsSenateurs augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/>

属性が適切に設定されていることをログで確認できますが、el 式の評価の結果によって値セットが変更されることはありません。ユーザーが別のコンポーネントで項目を選択すると、selectedSen の値が変化します。

驚いたことに、インターフェイス宣言の componentType 属性を削除して、cc.attrs.augmentedSen 値を出力するだけで、適切に更新されます。バッキング Bean のインスタンスが 1 つしか存在しないことは理解できます。しかし、属性が適切に更新されないのはなぜですか?

複合コンポーネントのインスタンスにパラメトリック ID (次のようなもの) を与えることでごまかそうとしました

<sen:timelineMandatsSenateurs id="tl_#{selectionContext.selectedSen.sen.senmat}" augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/>

)。

また、パラメーターが null でない場合にのみレンダリングされる、dynamic="true" を指定して primefaces p:outputPanel にカプセル化しましたが、これは何も変更しません。

<p:outputPanel id="graph" dynamic="true" rendered="#{not empty selectionContext.selectedSen}">
    <sen:timelineMandatsSenateurs augmentedSen="#{selectionContext.selectedSen}" timelineWidth="700" forceMinMax="true"/>
</p:outputPanel>

では、パラメータとして渡された EL 式が再評価され、属性が適切に更新されるようにするにはどうすればよいでしょうか?

よろしくお願いします。

私は使っている :

  • トムキャット 6.0.33
  • マイフェイス 2.1.7
  • プライムフェイス 3.2
  • CODI 1.0.5
  • OWB 1.1.3
4

1 に答える 1

0

問題を確認しました。StateHelperメソッドを使用してプロパティをコンポーネントクラスに実装する必要があります。そうしないと、プロパティが保存および復元されません。

を見てみましょう:

http://svn.apache.org/repos/asf/myfaces/core/trunk/api/src/main/java/javax/faces/component/UIOutput.java

そこで、その方法がわかります。ただし、あなたの場合、augmentedSenプロパティをコンポーネントに実装する必要はまったくなく、代わりに、格納されているValueExpressionを使用して適切なBeanを見つける必要があると思います。「augementedSen」が複合コンポーネントの「アタッチされたオブジェクト」である場合、コンバーター、バリデーター、またはビヘイビアーと同様に、コンポーネントクラスに実装する意味があります。

于 2012-06-14T10:41:13.637 に答える