【问题标题】:XPages: why is my application bean instantiated twice?XPages:为什么我的应用程序 bean 实例化了两次?
【发布时间】:2018-10-26 00:00:23
【问题描述】:

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

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

日志按 SessionStarted 分类,第 1 页和第 3 页的开始日期/时间相同,但第 2 页不同。

其他信息:

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

我完全感到困惑......任何解决这个问题的提示都非常受欢迎!

谢谢大家!

【问题讨论】:

  • 你是如何存储地图的?
  • 我会更新问题。

标签: java xpages javabeans


【解决方案1】:

尽管努力清理代码,但没有任何帮助。所以我开始思考为什么总是第二页触发了新托管 bean 的实例化(如果是这样的话)。

事实上,他们的地址簿中有很多网站的重定向。他们中的大多数,例如对于主页,指向 SITE.nsf,但也有一些使用 Site.nsf。显然(基于 Linux 的)Domino 服务器将此视为 2 个不同的链接,它以相同的方式处理它们(一切正常),但在内部它创建了 2 个不同的托管 bean(应用程序范围)。

这适用于 Domino R9.0.1FP7。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多