gpt4 book ai didi

java - HttpSession setAttribute 并不总是插入新对象

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:21 25 4
gpt4 key购买 nike

我正在努力从 WLS10g 和 JavaEE6 升级到 WLS12c 和 JavaEE7。

我注意到 HttpSession.setAttribute 的工作方式有所不同。在 WLS10 中,任何已经存储在某个键下的对象总是会被替换。

在 WLS12 中,如果 newObject.equals(oldObject),则对象不会被替换。

这对我们来说是个问题,因为应用程序有这样的对象:

class ValueObject {
int key;
String data;

@Override
public int hashCode()
{
return key;
}

boolean equals(Object o) {
if (o == null || (o instanceof ValueObject) == false) {
return false;
}
ValueObject otherObject = (ValueObject)o;
/* Return true if the keys are equal, even though the data may differ */
return key == otherObject.key;
}
}

ValueObject 通过跨越多个网页的工作流程进行修改。中间值存储在 HTTPSession 中,并在工作流结束时将修改后的值写入数据库。

在servlet中有这样的代码(成员实际上是通过getters/setters修改的,但是我简化了以减少问题中的代码量):

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
HttpSession session = request.getSession();
ValueObject newValue = new ValueObject();
newValue.key = Integer.parseInt(request.getParameter("key"));
newValue.data = request.getParameter("data");
session.setAttribute("value", newValue);
...

newValue.key 未修改,而 newValue.data 具有新值。

WLS12 中 HttpSession 的修改行为打破了这种模式 - 当从 session 中检索对象时,我们从第一步中获取 data,因为对象不是当我们尝试存储更新版本时不会替换。

我们可以通过更改所有更新来解决此问题:

session.setAttribute("value", newValue);

session.removeAttribute("value");
session.setAttribute("value", newValue);

但是,有 100 多个 servlet,因此工作量很大。解决方法既丑陋又容易出错,因为程序员在编写代码时需要跟踪另一件事。

有什么方法可以配置 WLS12c 以使用对象始终被替换为 HttpSession.setAttribute() 的旧行为?

2015-09-30 更新:

向 Oracle 提交错误报告。我已经尝试过 wero 建议的过滤器想法。 Weblogic 似乎希望过滤器链下的对象属于 weblogic.server.internal.ServletRequestImpl 类,因为当我包装它并将包装器发送到过滤器链下时,我从内部得到了一个 ClassCastException Weblogic 类。

我还按照 Gimby 的建议检查了配置选项。我找不到该 session 的任何适用选项。我们部署到单个服务器并使用 memory 作为 session 持久性设置。

2016-02-03 更新:

Oracle 已将错误报告关闭为“不是错误”。

最佳答案

由于 Oracle 将错误报告关闭为“不是错误”,我决定实现解决方法。

我检查了对 HttpSession.setAttribute 的所有调用,并确定了哪些调用使用了可能触发错误的对象。

在那些我替换的地方

session.setAttribute(key, newValue);

session.removeAttribute(key);
session.setAttribute(key, newValue);

连同解释为什么需要额外行的注释。

关于java - HttpSession setAttribute 并不总是插入新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32839048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com