1

私のアプリケーションには、次の Bean があります。

@Named(value = "mrBean")
@SessionScoped
public class MrBean implements Serializable {

    @EJB
    private MrsBean mrsBean;

    private Item item;

    public void updateItem() {
        this.item = mrsBean.updateItem(item.getId());
    }

}

@Named(value = "itemBean")
@RequestScoped
public class itemBean {
    @Inject
    private MrBean mrBean;

    @PostConstruct
    public void init() {
        if (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("update") != null) mrBean.updateItem();
    }
}

ページにアイテムの情報を表示する前に、表示する前にアイテムを更新するためにパラメーターが送信されてViewItem.xhtmlいるかどうかを確認します。update

パラメーターを使用してページをテストすると、update=true更新された新しいデータではなく古いデータがレンダリングされた理由がわかりません。実際、新しいデータがレンダリングされる前に、ページを更新する必要があります。

@PostConstruct上記の結果から、ビューがレンダリングされた後にメソッドが呼び出されたのではないかと思います。

アドバイスをいただければ大変助かります。

よろしくお願いします、

4

2 に答える 2

3

これは、がビューの#{itemBean}に初めて参照された場合に発生する可能性があります。例えば #{mrBean.item}

#{mrBean.item}
...
#{itemBean}

管理対象Beanは、EL式が初めて参照するときに初めて構築され、スコープにはまだ存在しません。管理対象Beanインスタンスがtaghandler属性またはによって参照されないGETリクエストではf:event、レンダリング応答中にのみ構築されます。

が参照される前に#{itemBean}常に参照される(したがって構築される)ようにそれらを再配置することが不可能な場合は、代わりにを作成することをお勧めします。 #{mrBean.item}@PostConstruct#{itemBean}<f:event type="preRenderView">

<f:event type="preRenderView" listener="#{itemBean.init}" />
于 2012-07-25T18:21:33.730 に答える
1

念のため、別の解決策を投稿しています。ページがレンダリングされるたびに初期化メソッドを呼び出すことで、別のアプローチを試すことができ、要求 Bean による更新を回避できます。次のメタデータ タグを xhtml に追加します。

<f:metadata>
    <f:event type="preRenderView" listener="#{mrBean.init}" />
</f:metadata> 

MrBean で、次のメソッドを定義します。

public void init() {
    if(!FacesContext.getCurrentInstance().isPostback() && FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("update") != null) 
        mrBean.updateItem();
}

このようにして、ViewItem ページがレンダリングされるたびに updateItem チェックが行われます。MrBean が SessionScoped ではなく ViewScoped である場合、代わりに@PostConstruct注釈を使用することをお勧めします。

于 2012-07-25T17:47:49.453 に答える