2

リクエスト スコープの JSF 1.2 マネージド Bean がありましたが、これをセッション スコープ Bean にリファクタリングする必要がありました。これは、高価な操作を行って@PostConstructおり、実際には 1 回だけ実行する必要がある複数回呼び出されているためです。スコープをセッションに変更することの副作用は、次のようFacesContextにしてもう注入できないことです。faces-config.xml

<managed-property>
 <property-name>context</property-name>
 <value>#{facesContext}</value>
</managed-property>

私が持っている場所

setContext(FacesContext ctx) {}

私のマネージドBeanで。

アクション メソッドの 1 つで、ExternalContext/にアクセスするためのコンテキストが必要HttpServletResponseです。呼び出したくない

FacesContext.getCurrentInstance();

私のアクションメソッド内ではなくsetContext(FacesContext ctx)、モックテストを容易にするためにコンテキストインジェクションを分離できるように、何らかの形で外部から呼び出します。後でそれがリクエストごとのものであることを理解するためだけにsetContext()内部を入れてみましたが、新しいリクエストが送信されるとリセットされました。@PostConstructFacesContextExternalContextnull

setContext(FacesContext ctx)マネージド Bean 自体はセッション スコープですが、新しいリクエストをヒットするたびに自動的に魔法のように呼び出すにはどうすればよいですか?

4

1 に答える 1

1

リクエストスコープのBeanを保持し、代わりにセッションスコープのBeanを注入して、リクエストスコープのBeanに渡すことができるようにしFacesContextます@PostConstruct。セッションスコープのBeanで、遅延読み込み/実行を実行します。

例えば

public class RequestBean {

    private FacesContext context; // Managed property.
    private SessionBean sessionBean; // Managed property.

    @PostConstruct
    public void init() {
        sessionBean.init(context);
    }

    // ...
}

public class SessionBean {

    private SomeObject initializedObject;

    public void init(FacesContext context) {
        if (initializedObject != null) {
            return;
        }

        initializedObject = initializeObject(context);
    }

    // ...
}
于 2012-06-25T19:47:11.743 に答える