7

DAOと対話する必要のある(複合)コンポーネントを作成しています。Java部分の宣言方法は次のとおりです。

@FacesComponent(value="selectLocation")
public class SelectLocation extends UINamingContainer {

DAOオブジェクトを取得するために、CDIアノテーションを試しました。

    @Inject private LocationControl lc;

そしてそれはうまくいかなかったので、私はFacesアノテーションを試しました:

    @ManagedProperty (value = "@{locationControl}") private LocationControl lc;

どちらの場合も何も起こりません。コンストラクターが終了すると、プロパティlcはnullになります。

私はすべてのバッキングBeanでCDIを使用していますが、すべて機能します。これは、GlassFish3.1.1内でWeldを使用します。リソースを取得する方法について何か提案はありますか?

4

3 に答える 3

5

私は今のところ回避策を持っています。それは基本的にCDIらのボイラープレートコードを入れることです。al。廃止することになっています。私は今この方法を持っています:

public LocationControl getLocationControl() {
    if (lc != null) return lc;
    FacesContext fc = getFacesContext();
    Object obj = fc.getApplication().evaluateExpressionGet(fc, "#{locationControl}", LocationControl.class);
    if (obj instanceof LocationControl) lc = (LocationControl) obj;
    return lc;
}

誰かがより良い解決策を持っているかどうか知りたいです。

于 2011-08-23T21:44:00.397 に答える
2

コンポーネントでも機能するかどうかはわかりませんが、CDI + MyFaces CODIを使用すると、@ Advancedをマークして、たとえば@Injectを使用できるフェーズリスナーをマークできます。それが機能しない場合は、JIRAで機能リクエストを作成できます。それらはかなり高速で、頻繁にリリースされます。

または、次を使用します。MyBean myBean = BeanManagerProvider.getInstance()。getContextualReference(MyBean.class); 手動で。

于 2011-08-23T23:49:52.463 に答える
2

回避策なしでこの作業を行う方法はありますか?

はい、通常の方法でバッキング Bean を使用してください。

<x:someComponent value="#{someBean.someProperty}" />

必要に応じて、再利用可能なタグファイル/コンポジットでラップして、DRY に保ちます。

<my:someComponent />
于 2013-06-04T12:50:19.640 に答える