現在JavaEE5(WL 10.3.5)アプリケーションをJavaEE 7(WL 12.2.1)に移行していますが、私は奇妙な問題に直面しています。WebLogic 12cはsetAttributeメソッドを使用してHttpSession APIコントラクトを解除していますか?
HttpSession.setAttribute(String、Object)メソッドのWebLogic 12c実装は、同じ文字列キーにバインドされた古いオブジェクトを新しいオブジェクトで置き換えません(WL12cの実装によれば同じです)。
いくつかのテストの後で、セッション中のオブジェクトを置き換えたい場合、WL12cはhashCodeが等しい場合はそれを比較し、オブジェクトwhith()を比較します。 equals()が 'true'を返す場合、WL12cはオブジェクトを置き換えません!
しかし、JavaEEの7 APIドキュメントには、このような情報はありません。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*/
}
そして、我々は、同じIDを持つ
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);
2つのオブジェクトを行うサーブレットであるとします。 WL12cでは、セッションには依然としてobj1が含まれます。
Iは、コードを変更した場合(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:この単純なwebapp(同じ戦争)をTomcat 9とWildfly 11でテストしました。セッション中にオブジェクトを置き換えないのはWebLogic 12.2.1だけです。
編集2:私は、私のオリジナルのポストでそれを示すものではありませんでしたが、私はこの問題についてのトピックを発見し、それが関連するすべての答えずに閉じられました:Weblogicの12cに HttpSession setAttribute doesn't always insert new object
これらの詳細についてありがとうございました。つまり、OracleのWeblogic 12cは、セッション永続性の考慮事項としてJava EE7 API(少なくともサーブレットAPI)を破棄していますか? (これは私の話題の質問です) – Zou
はい。私はそれを強く推測する。 –