我有一个请求范围的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)
?
答案 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);
}
// ...
}