XPages:为什么我的应用程序 bean 被实例化了两次?
XPages: why is my application bean instantiated twice?
XPages 再次以神秘的方式移动。它显示的行为我只能通过假设创建两次应用程序范围托管 bean 来解释。 managed bean包含了一个保存session相关数据的Map,实际上是基于SessionID的。我使用相同的 SessionID 向 bean 请求会话数据,但得到了不同的结果。控制台两次显示新的 SystemData...
这是我脸上的一部分-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>
class 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 class:
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页的开头相同date/time,但第2页不同
其他信息:
- 这只是一个简单的网站,匿名,无需登录
- 第一个页面创建第一个 SystemData
- 单击打开下一页,其中包含新的系统数据
- 再次单击会打开另一个页面,该页面采用创建的第一个系统数据
- 奇怪的是,第二页总是创建一个新的 SystemData
- 据我所知没有集群
我完全不知所措...任何解决此问题的提示都将非常受欢迎!!
谢谢大家!
尽管在清理代码方面付出了所有努力,但没有任何帮助。所以我开始思考为什么 always 第二页触发了新托管 bean 的实例化(如果是的话)。
事实上,他们的地址簿中有很多网站的重定向。他们中的大多数,例如对于主页,指向 SITE.nsf,但也有一些使用 Site.nsf。显然(Linux-based)Domino 服务器将其视为 2 个不同的链接,它以相同的方式处理它们(一切正常),但在内部它创建了 2 个不同的托管 bean(应用程序范围)。
这是针对 Domino R9.0.1FP7 的。
XPages 再次以神秘的方式移动。它显示的行为我只能通过假设创建两次应用程序范围托管 bean 来解释。 managed bean包含了一个保存session相关数据的Map,实际上是基于SessionID的。我使用相同的 SessionID 向 bean 请求会话数据,但得到了不同的结果。控制台两次显示新的 SystemData...
这是我脸上的一部分-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>
class 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 class:
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页的开头相同date/time,但第2页不同
其他信息:
- 这只是一个简单的网站,匿名,无需登录
- 第一个页面创建第一个 SystemData
- 单击打开下一页,其中包含新的系统数据
- 再次单击会打开另一个页面,该页面采用创建的第一个系统数据
- 奇怪的是,第二页总是创建一个新的 SystemData
- 据我所知没有集群
我完全不知所措...任何解决此问题的提示都将非常受欢迎!!
谢谢大家!
尽管在清理代码方面付出了所有努力,但没有任何帮助。所以我开始思考为什么 always 第二页触发了新托管 bean 的实例化(如果是的话)。
事实上,他们的地址簿中有很多网站的重定向。他们中的大多数,例如对于主页,指向 SITE.nsf,但也有一些使用 Site.nsf。显然(Linux-based)Domino 服务器将其视为 2 个不同的链接,它以相同的方式处理它们(一切正常),但在内部它创建了 2 个不同的托管 bean(应用程序范围)。
这是针对 Domino R9.0.1FP7 的。