我们有一个运行在weblogic上的JSF应用程序,具有作为会话缓存的一致性。应用程序的一个部分在同一页面中同时使用会话范围的bean和视图范围的bean。会话bean是视图bean上的@ManagedProperty。我们在初始化视图Bean时获得了注入的当前会话Bean,但是此后,我们总是获得相同的会话Bean,而视图Bean中从未对其进行更新。如果刷新页面或查看会话Bean,则页面已更新,只是未在视图Bean中更新。这只有在我们启用连贯性时才会发生。
我创建了一个非常简单的示例来说明这种行为
会话Bean
@ManagedBean(name = "sessionBean")
@SessionScoped
public class SessionBean implements Serializable {
public SessionBean() {
super();
}
@PostConstruct
public void init() {
System.out.println("Session bean initialized");
}
private String name;
public void setName(String name) {
this.name = name;
System.out.println("Setting the name in setName() to " + name);
}
public String getName() {
return name;
}
}
查看Bean
@ManagedBean(name = "viewBean", eager=true)
@ViewScoped
public class ViewBean implements Serializable{
public ViewBean() {
super();
}
@PostConstruct
public void init() {
System.out.println("view bean initialized");
}
@ManagedProperty("#{sessionBean}")
private SessionBean sessionBean;
public void checkSession(){
FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
System.out.println("The name in the session bean is " + sessionBean.getName());
System.out.println("The session ID is " + session.getId());
}
public void setSessionBean(SessionBean sessionBean) {
this.sessionBean = sessionBean;
}
public SessionBean getSessionBean() {
return sessionBean;
}
}
JSF页面
<f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<html xmlns="http://www.w3.org/1999/xhtml">
<h:head></h:head>
<h:body>
<h:form>
<h:inputText id="myName" value="#{sessionBean.name}"/>
<h:commandButton value="Session Name" action="#{viewBean.checkSession()}"/>
</h:form>
</h:body>
</html>
</f:view>
如果我们执行以下操作:
输出“会话bean已初始化”
输出“将setName()中的名称设置为一个”
输出“已初始化视图bean”
输出“会话bean中的名称为一个”
输出“将setName()中的名称设置为两个”
输出“会话bean中的名称为一个”
像这样的不良做法混合范围内的bean吗?有调试步骤吗?
谢谢!