6

多くのチュートリアルの 1 つ (私はPrimeFacesを使用しています) に従ってカスタムJSFコンポーネントを作成しました。コンポーネントに正常に渡された引数を追加しました。

<c:custom command="command"/>
public void setCommand(String command) {
    log.debug("setCommand {}", command);
    this.command = command;
}

しかし、カスタム型の引数が必要です。これは、最も些細なケースのみを扱っているチュートリアルでは見つけることができませんでした。

<c:custom image="#{currentImageBean.image}"/>
public void setImage(Object image) {
    log.debug("setImage {}", image);
    this.image = (Image) image;
}

Bean はImage型のオブジェクトを返していますが、setter は呼び出されていません。そうでなければ、優れたチュートリアルでそのケースについて言及する必要があるため、これが機能することを期待していましたが、今では最悪のエラーに悩まされています.何も起こらず、理由を示唆するログには何もありません. 、何を変更する必要があるか、潜在的なエラーを探す場所は?

4

1 に答える 1

6

これは、カスタム タイプとは関係ありません。attributename="attributevalue"これは、 vs のように ELに対してリテラル (静的) 値を使用することに関係していますattributename="#{attribute.value}"

この動作は予期されたものであり、仕様によるものです。ValueExpressionEL 式 ( s)である属性値は、 によって設定されていUIComponent#setValueExpression()ます。つまり、それらは実際に要求されたとき、通常はビューのレンダリング時にのみ評価されることになっています。動的な値式の性質を無効にするため、インスタンスのベイク中に直接評価しないでくださいUIComponent(データ テーブルの現在の反復ラウンドに依存することを考えてください)。

UIComponent#getStateHelper()EL 値式を保持できる属性のゲッター/セッターを、ローカル プロパティではなくデリゲートすることをお勧めします。setValueExpression()つまり、最終的には意志もStateHelper. は、 からのUIComponent#getAttributes()値も解決しますStateHelper

public Image getImage() {
   return (Image) getStateHelper().eval("image");
}

public void setImage(Image image) {
    getStateHelper().put("image", image);
}

ローカル プロパティがないことに注意してください。したがって、属性の (評価された) 値が必要な場合は、getter を呼び出すだけです。

set 属性のロギングである初期の機能要件を達成するために、ロギング ステートメントをsetValueExpression()オーバーライドに追加することができますsuper

@Override
public void setValueExpression(String name, ValueExpression binding) {
    log.debug(....);
    super.setValueExpression(name, binding);
}
于 2012-11-21T12:09:20.460 に答える