@ExportでセッションにいれたオブジェクトをInterceptorで使うとき
まず、@Exportでセッションにオブジェクトを設定する。
public class HogeServiceImpl implements HogeService { public MogeDto mogeDto; public void hoge() { mogeDto = .... } @Export(storage=StorageType.SESSION) public MogeDto getMogeDto() { return mogeDto; } }
で、以下のようなInterceptorの中で、上記で設定したmogeDtoを取り出して、instanceofでチェックすると、思ったとおりの結果にならない。
public class SessionCheckInterceptor extends AbstractMethodInterceptor { private S2Container container; public void setContainer(S2Container container) { this.container = container; } public Object invoke(MethodInvocation invocation) throws Throwable { Map sessionMap = container.getExternalContext().getSessionMap(); Object attrValue = sessionMap.get("mogeDto"); if (attrValue != null) { System.out.println(attrValue instanceof MogeDto); } } }
原因は、以下で説明されているHotDeployClassLoaderがらみ。
http://d.hatena.ne.jp/koichik/20061118#1163869222
HotDeployでなくCoolDeployだと、思ったとおりに動くのだけど、やっぱりHotDeployでさくさく開発したい。
で調べてたら、以下で、HotdeployUtil.rebuildValue() ってのがある。と。
https://www.seasar.org/issues/browse/FLEX-16
で、こんな感じで直したら、うまくいった。
これがスマートな解決方法かわからないけど。。
public class SessionCheckInterceptor extends AbstractMethodInterceptor { private S2Container container; public void setContainer(S2Container container) { this.container = container; } public Object invoke(MethodInvocation invocation) throws Throwable { Map sessionMap = container.getExternalContext().getSessionMap(); Object attrValue = sessionMap.get("mogeDto"); if (attrValue != null) { attrValue = HotDeployUtil.rebuildValue(attrValue); System.out.println(attrValue instanceof MogeDto); } } }
このHotDeployUtil.rebuildValue() だけど、ソースを見ると HotDeployが無効になっているときは、何もせずに、引数のオブジェクトをそのまま返すようになっている。
パフォーマンスの問題にもならなそうだし、このまま製品コードに含めてしまっても、特に問題なさげ。