我目前正在将JavaEE5(WL 10.3.5)应用程序迁移到JavaEE 7(WL 12.2.1),而我正面临一个奇怪的问题。
方法HttpSession.setAttribute(String,Object)的WebLogic 12c实现不会在对象相同的情况下用新对象替换绑定到同一字符串键的旧对象(根据WL12c' s实现相同)。 / p>
经过多次测试,当你想在会话中替换一个对象时,WL12c比较hashCode是否相同,它比较对象whith equals()。如果equals()返回' true' WL12c不会替换对象!
但JavaEE 7 Api doc中没有此类信息:setAttribute(String, Object)
使用指定的名称将对象绑定到此会话。如果 同名的对象已绑定到会话,对象是 替换。
根本没有提及"只有当要替换的对象根据hashCode和equals方法"。
不相同时测试示例,假设我们有一个MyClass类
import org.apache.commons.lang.builder.HashCodeBuilder;
class MyClass{
private Long id;
private String myProperty;
private static final int HASHCODE1 = -459751453;
private static final int HASHCODE2 = 981454267;
public MyClass(Long id, String myProperty) {
this.id = id;
this.myProperty = myProperty;
}
// Override equals based on the id only
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || this.getClass() != obj.getClass()) {
return false;
}
MyClass myClass = (MyClass) obj;
if (this.getId() != null) {
return this.getId().equals(myClass.getId());
}
return false;
}
// Override hashCode based only on id
@Override
public int hashCode() {
return new HashCodeBuilder(HASHCODE1, HASHCODE2).append(this.getId()).toHashCode();
}
/* Getters & Setters*/
}
在servlet中我们做
MyClass obj1 = new MyClass(1L, "prop1");
MyClass obj2 = new MyClass(1L, "prop2");
request.getSession().removeAttribute("key");
request.getSession().setAttribute("key", obj1);
request.getSession().setAttribute("key", obj2);
两个具有相同ID的对象。在WL12c中,会话仍将包含obj1。
如果我更改了代码(obj1.id = 2)
MyClass obj1 = new MyClass(1L, "prop1");
MyClass obj2 = new MyClass(2L, "prop2");
request.getSession().removeAttribute("key");
request.getSession().setAttribute("key", obj1);
request.getSession().setAttribute("key", obj2);
会话将包含obj2。
我们在WebLogic 10.3.5中没有具有相同文档的此行为。那么,WL12c不符合Java EE 7 API吗?如果不是为什么?
Rem:通过扩展,我认为它对请求和应用程序属性来说是一样的。
编辑1:我在Tomcat 9和Wildfly 11中测试了这个简单的webapp(同样的战争).WebLogic 12.2.1是唯一一个不会在会话中替换对象的人。
编辑2:我没有在我原来的帖子中注明,但我只发现了一个关于这个问题的话题而且没有任何相关答案就关闭了: HttpSession setAttribute doesn't always insert new object
答案 0 :(得分:0)
Weblogic 12c中的会话管理获得了许多更新。访问您的Weblogic管理页面,了解您的会话是如何管理的。基于JDBC的会话持久性可能是重要的。