2

我有一个请求范围的 JSF 1.2 托管 bean,我需要将它重构为会话范围的 bean,因为它正在执行一些昂贵的操作,@PostConstruct并且被多次调用,实际上只需要执行一次。将范围更改为会话的副作用是现在我不能FacesContextfaces-config.xml通过这样的方式注入:

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

我在哪里

setContext(FacesContext ctx) {}

在我的托管 bean 中。

在我的一种操作方法中,我需要上下文来访问ExternalContext/ HttpServletResponse。我不想调用

FacesContext.getCurrentInstance();

在我的操作方法中,但以某种方式在setContext(FacesContext ctx)外部调用以允许隔离上下文注入,以便于模拟测试。我试着把里面的东西放在setContext()里面,@PostConstruct后来才意识到这FacesContext是每个请求的事情,一旦提交了新的请求,我的ExternalContext就被重置了。null

尽管托管 bean 本身是会话范围的,但我如何在setContext(FacesContext ctx)每次遇到新请求时自动调用?

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 回答