2

コンストラクター/ポストコンストラクターで初期化したい FacesComponent を作成しました。問題はそこgetAttributes()が空であることです。以下に例を示します。

@FacesComponent("articleComponent")
public class ArticleFacesComponent extends UINamingContainer {

    private Article article;

    public ArticleFacesComponent() {
        Object idObj = getAttributes().get("articleId"); // I want to get article id to initialize object but getAttributes() is empty
        ...
        article = em.find(Article.class, id);
    }

}
4

2 に答える 2

4

encodeAll()メソッドでジョブを実行する必要があります。コンポーネントがレンダリングされようとしているときに、レンダリング応答中に呼び出されます。

@Override
public void encodeAll(FacesContext context) throws IOException {
    // Here.

    super.encodeAll(context);
}

から拡張していることを考えると、複合コンポーネントUINamingContainerのバッキング コンポーネントを作成している可能性が最も高いでしょう。その場合、この記事では、開始するのに役立つ洞察を提供する必要があります:複数の入力フィールドを持つ複合コンポーネント


具体的な問題とは関係ありませんが、コンポーネント内の DB へのアクセスは臭いです。Articleむしろ、完全なインスタンスを ID ではなくコンポーネント値として渡します。コンポーネント/レンダラーは、モデルに基づいてフロントエンド (HTTP/HTML) のみを処理し、バックエンド (DB/SQL) を処理する必要はありません。コンポーネントが動作する必要がある正確なモデルをコンポーネントに提供する必要があります。

于 2013-03-14T01:49:18.673 に答える