マーシャリングされていないオブジェクトのリストを反復処理しようとするとClassCastExceptions が発生することがあり、追跡が非常に困難な問題が発生しています。重要なビットは時々、再起動後に特定のコードが正常に動作することです。これは、同時実行/タイミング/競合状態の方向を示しているようです。JAXBContext も、マーシャラーとアンマーシャラーも同時に使用されていないことを確認できます。ロックによってそれらへのアクセスをシリアル化するところまで行きました。
ただし、Spring DM を介して個々のバンドルが非同期に初期化される OSGi プラットフォームで実行しているため、2 つの異なるバンドルが同時に JAXBContext を作成している可能性があります。
いずれにせよ、これらの断続的なClassCastExceptions を引き起こす可能性のある原因についての説明へのポインタをいただければ幸いです。コード自体は正常に動作しているが、何らかの外部要因が動作に影響を与えているように見えることを示すため、断続的であることが重要です。
例外の具体例を次に示します (会社固有のものを削除したことに注意してください)。
Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to com.foobar.TunnelType
at com.foobar.NetMonitorImpl.getVpnStatus(NetMonitorImpl.java:180)
180行目のそのメソッドは、アンマーシャリングされたオブジェクト内のTunnelTypeオブジェクトのコレクションをループするfor()コンストラクトです(アンマーシャリングは問題なく機能します)。
実際のオブジェクトのアンマーシャリングが正常に行われたとすると、JAXB が ElementNSImpl オブジェクトをネストされたコレクション内に残すことは物理的に可能でしょうか?
実行時環境:
- JAXB2.1
- OSGi
- 春のDM
- JAXBContext は、整列化/非整列化されるクラスを含むバンドルの ClassLoader で初期化されます