@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が無効になっているときは、何もせずに、引数のオブジェクトをそのまま返すようになっている。
パフォーマンスの問題にもならなそうだし、このまま製品コードに含めてしまっても、特に問題なさげ。