打开会话缓存时,无法插入会话bean

时间:2018-07-20 15:02:48

标签: jsf oracle-coherence

我们有一个运行在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>

如果我们执行以下操作:

  1. 打开页面
  

输出“会话bean已初始化”

  1. 在框中键入:“一个”,然后单击命令按钮
  

输出“将setName()中的名称设置为一个”

     

输出“已初始化视图bean”

     

输出“会话bean中的名称为一个”

  1. 在框中键入“两个”,然后单击命令按钮
  

输出“将setName()中的名称设置为两个”

     

输出“会话bean中的名称为一个”

像这样的不良做法混合范围内的bean吗?有调试步骤吗?

谢谢!

0 个答案:

没有答案