4

セッション スコープの CDI マネージド Bean があります。

@Named
@SessionScoped 
public class SampleBean implements Serializable {
    // ...
}

この回答に見られるように、次のコードを使用した特定のフローの後に、セッションからこの Bean を削除する必要があります。

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");

ただし、それは機能せずSampleBean、セッションに残ります。
何か不足していますか?

4

3 に答える 3

9

JSF マネージド Bean とは対照的に、CDI マネージド Bean はマネージド Bean 名によってセッション マップに直接保存されません。代わりに、セッション ID をキーとして使用して、CDI マネージャーの実装 (Weld、OpenWebBeans など) によってサーバーのメモリに格納されます。

したがって、そこで使用したトリックは、CDI マネージド Bean には適用できません。別のアプローチを探す必要があります。この特定のケースでの正しいアプローチは、@ConversationScoped代わりに を使用することです@SessionScoped。適切に設計された Web アプリケーションでは、スコープを手動で終了する必要はありません。したがって@SessionScoped、会話/フローに使用することは、そもそも間違っていました。

于 2013-09-19T15:24:58.990 に答える
-1

この ?

FacesContext .getCurrentInstance() .getApplication() .createValueBinding( "#{yourBeanName}").setValue(FacesContext.getCurrentInstance(), null );

于 2015-04-13T01:39:57.160 に答える