セッションにオブジェクトを保存しています。私のコントローラーでは、ユーザーがリクエストを送信すると、同時に次のコードが実行されます。
MyObject obj = (MyObject) req.getSession().getAttribute("myObject");
while(!obj.isNewResultAvailable()){
//will loop until new result is available.
}
前述のように、同時に実行されるため、コントロールがまだループ内にある間、ユーザーは別のボタンを押すなど、他のことを行うことができます。次のことを行うコントローラーにリクエストが送信されます。
MyObject obj = (MyObject) req.getSession().getAttribute("myObject");
obj = null;
私の予想では、新しい結果が得られるまでループするコードはNullPointerException
. そうではないことを見つけるためだけに。
null
では、そのオブジェクトを別のコントローラーに設定しているにもかかわらず、別のコントローラーのセッションからオブジェクトがプルされないのはなぜnull
ですか?
編集 :
私の現在のコードでは、実際にやってみました
req.getSession().setAttribute("myObject", null);
と
req.getSession().removeAttribute("myObject");
それでも、それは私の問題を解決しませんでした.whileループ内のオブジェクトはまだnull化されていません.
実現
この種の混乱に陥る人にとって、私の問題の根本は、Java でオブジェクトがどのように渡されるか混乱していることです。私の問題は単純で、オブジェクト自体ではなく null への参照をobj = null
設定するだけです。obj
モルガノが指摘したように、セッション内のオブジェクトは、while ループを実行するスレッドによってローカルに参照されているため、オブジェクトが null になることはreq.getSession().setAttribute("myObject", null);
ありreq.getSession().removeAttribute("myObject");
ません。これらは基本的に、セッションからオブジェクトへの参照を削除するだけです (したがって、理想的には gc の候補にします。これは、オブジェクトが長時間実行されている http 要求によってローカルで参照されるため、私の状況では発生しません [while ループのこと]) .