在解组期间从ElementNSImpl到拥有类型的间歇性ClassCastException

Bor*_*zic 7 java exception jaxb unmarshalling race-condition

我们正在经历一个非常难以追踪的问题,我们在尝试迭代一组未编组对象时有时会看到ClassCastExceptions .最重要的一点是,有时,在重新启动后的特定代码工作正常.这似乎指向了并发/时间/竞争条件的方向.我可以确认JAXBContext,marshallers和unmarshallers都没有被同时使用.我们已经通过锁定序列化对它们的访问.

但是,由于我们在OSGi平台上运行,其中各个捆绑包通过Spring DM异步初始化,因此可能有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)
Run Code Online (Sandbox Code Playgroud)

第180行的那个方法是for()构造循环在一个解组对象内部的TunnelType对象集合(所述解组工作正常BTW).

鉴于实际的对象解组很好,JAXB在物理上是否可以将ElementNSImpl对象留在嵌套集合中?

运行环境:

  • JAXB 2.1
  • OSGi的
  • 春天DM
  • JAXBContext使用包含要编组/解组的类的包的ClassLoader进行初始化

Bor*_*zic 0

出于绝望,我们转向在JAXBContext.class对象上进行同步,认为这是某些竞争条件的唯一剩余可能性,至少我们无法再次重现此问题。这是关键代码:

synchronized (JAXBContext.class) {
    context = JAXBContext.newInstance(packageList, classLoader);
}
Run Code Online (Sandbox Code Playgroud)