将FacesContext注入会话范围的托管bean的托管属性

时间:2012-06-25 18:50:47

标签: jsf servlets jsf-1.2 facescontext

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

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

我在哪里

setContext(FacesContext ctx) {}

在我的托管bean中。

在我的某个操作方法中,我需要上下文才能访问ExternalContext / HttpServletResponse。我不想调用

FacesContext.getCurrentInstance();

在我的action方法中但不知何故在外部调用setContext(FacesContext ctx)以允许隔离上下文注入以便于模拟测试。我尝试将setContext()放在@PostConstruct内,以便稍后意识到FacesContext是针对每个请求的事情,并且我的ExternalContext在新请求后重置为null正在提交。

虽然托管bean本身是会话范围的,但每次遇到新请求时,我怎么能自动地调用setContext(FacesContext ctx)

1 个答案:

答案 0 :(得分:1)

保留您的请求范围bean并在其中注入会话范围的bean,以便您可以在请求范围bean的FacesContext中将@PostConstruct传递给它。在会话范围的bean中,执行延迟加载/执行。

E.g。

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);
    }

    // ...
}