S2Flex2とHibernateの連携で嵌り中

S2Flex2Hibernateを使ってみた.(ただし,HibernateS2Hibernateでは無い.
・・・けど思うように動いてくれない.

どうも,Hibernateでlazy-fetchしたEntityをS2Flex2経由でFlex2に返そうとするとダメみたい.

StackTraceは以下のとおり.

2007/11/26 14:41:41 [ERROR] [].[/s2flex2-example].[gateway]] [http-8080-Processor25] サーブレット gatewayServlet.service()が例外を投げました
org.seasar.framework.exception.IllegalAccessRuntimeException:
[ESSR0042]sun.misc.Launcher$ExtClassLoaderで不正なアクセスがありました。理由はjava.lang.IllegalAccessException: Class org.seasar.framework.util.MethodUtil can not access a member of class sun.misc.Launcher$ExtClassLoader with modifiers "public static"
       at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:85)
       at org.seasar.framework.beans.impl.PropertyDescImpl.getValue(PropertyDescImpl.java:188)
       at org.seasar.flex2.core.format.amf3.io.writer.impl.Amf3TypedObjectWriterImpl.writeClassObjectProperty(Amf3TypedObjectWriterImpl.java:103)
       at org.seasar.flex2.core.format.amf3.io.writer.impl.Amf3TypedObjectWriterImpl.writeClassObjectProperties(Amf3TypedObjectWriterImpl.java:71)
       at org.seasar.flex2.core.format.amf3.io.writer.impl.Amf3TypedObjectWriterImpl.writeClassObject(Amf3TypedObjectWriterImpl.java:64)
・・・以下,延々と続く
       at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
       at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
       at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
       at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.IllegalAccessException: Class org.seasar.framework.util.MethodUtil can not access a member of class sun.misc.Launcher$ExtClassLoader with modifiers "public static"
       at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
       at java.lang.reflect.Method.invoke(Method.java:578)
       at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:73)
       ... 99 more

IllegalAccessExceptionの直接の原因は,sun.misc.Launcher.ExtClassLoaderがパッケージプライベートな内部クラスだからだが,
問題は何故ClassLoaderをシリアライズしようとしてるのかという事.

まだ調査途中だが,今のところ状況としては,

  • lazy-fetchしなければ,正常に動作する
  • IllegalAccessExceptionを無視するように改造したら,Amf3TypedObjectWriterImpl.writeClassObjectの呼出でStackOverflowErrorとなった.(別のClassLoaderに入り込んで延々とシリアライズしようとしてる模様)
  • LiveCycle DataServiceだと問題なく動作する

ということで,S2Flex2におけるAMF3のハンドリングに問題があるのではと思っている.
S2Flex2どころかFlex2もほとんど触ったこと無いので使い方の問題だけの可能性も高いが.

もしかして解決済みの既知の問題であればうれしんだけど...
素直にS2Daoを利用しろというのは,ごもっともだけど,今回はその選択肢は無しで.