XPages:为什么我的应用程序bean实例化两次?

时间:2018-10-26 00:00:23

标签: java xpages javabeans

XPages再次以神秘的方式移动。它显示的行为只能通过假设两次创建应用程序范围托管的Bean来解释。托管bean包含一个Map,用于保存会话相关数据,实际上是基于SessionID的。我使用相同的SessionID向Bean请求会话数据,但结果却不同。控制台两次显示新的SystemData ...

这是我的faces-config.xml文件中的内容的一部分

<managed-bean>
<managed-bean-name>SystemData</managed-bean-name>
<managed-bean-class>nl.domain.SystemData</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

SystemData类的开头为:

public class SystemData implements Serializable {
    private static Map<String, WebLog> webLogs = new HashMap<String, WebLog>();

    private static final long serialVersionUID = -1L;
    public SystemData() throws NotesException {
        System.out.print("new SystemData");
        init();
    }

    public static WebLog getWebLog() throws NotesException {
        if (!isWebLogActive())
            return null;
        BaseXPage baseXPage = new BaseXPage();
        Cookie sessionCookie = (Cookie) baseXPage.getCookie().get("SessionID");
        if (sessionCookie == null)
            return null;
        String sessionId = sessionCookie.getValue();
        if (!webLogs.containsKey(sessionId))
            webLogs.put(sessionId, new WebLog(sessionId));
        return webLogs.get(sessionId);
    }

    ...

和WebLog类:

public class WebLog implements Serializable {
    private String id = null;
    private Map<String, Object> logMap = null;
    private Date started = null;

    public WebLog(String id) throws NotesException {
//      System.out.print("new WebLog");
        started = new Date();
        this.id = id;
    }

    public void open() {
        if (logMap == null) {
            logMap = new HashMap<String, Object>();
            logMap.put("Form", "BWLog");
            logMap.put("SessionStarted", started);
            logMap.put("SessionID", id);
        }
    }
    ...

我在生成的日志中看到的是:

View with log documents

日志按SessionStarted进行分类,第一页和第三页的开始日期/时间相同,而第二页的开始日期/时间不同。

其他信息:

  • 这只是一个简单的网站,匿名,没有登录
  • 第一页创建第一个SystemData
  • 单击即可打开下一页,其中包含新的SystemData
  • 再次单击将打开另一个页面,该页面将创建第一个SystemData
  • 奇怪的是,第二页总是创建一个新的SystemData
  • 据我所知没有集群

我完全不知所措...解决这个问题的任何提示都将是值得欢迎的!

谢谢大家!

1 个答案:

答案 0 :(得分:1)

尽管已尽力清理代码,但并没有真正的帮助。因此,我开始思考为什么第二页总是总是触发一个新的托管bean的实例化(如果是的话)。

实际上,在其通讯录中有许多网站重定向。其中大多数,例如对于主页,指向SITE.nsf,但有些使用Site.nsf。显然,(基于Linux的)Domino服务器将其视为2个不同的链接,它对它们的处理相同(一切正常),但在内部它会创建2个不同的托管bean(应用程序范围)。

这是针对Domino R9.0.1FP7的。