我们正在经历一个极其难以追踪的问题,我们看到ClassCastExceptions 有的时候 当试图迭代表的解组对象。重要的一点是 有的时候, 之后,重新启动特定的代码。这似乎指的方向并发性/时间/种族的条件。我可以确认,无论是JAXBContext,也没有marshallers和unmarshallers正在同时使用。我们已经尽序列化对它们的访问,通过上锁。

然而,由于我们运行在访平台,在这里,个人捆得到初始化异步通过春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)

这一方法在线180a()建造循环的集合TunnelType的对象内的一个解组对象(述解组工作的现顺便说一句).

给出的实际对象的解组去现,它甚至身体可能的修订离开ElementNSImpl的对象内的嵌套的集合?

运行时的环境:

  • 修订2.1
  • 访
  • 弹簧DM
  • 该JAXBContext初始化与这类装入器的捆包含类编组/解组
有帮助吗?

解决方案 3

出于绝望,我们转到同步的 JAXBContext.class 目,看到这个作为唯一剩余的可能性为某些比赛的条件,并至少我们没有能够重现这个问题。这里的关键码:

synchronized (JAXBContext.class) {
    context = JAXBContext.newInstance(packageList, classLoader);
}

其他提示

我得到这个例外,只有当我忘了告诉JAXBContext 关于所有可汇集类型,它可在处理。

JAXBContext.newInstance(MyClass1.class,MyClass2.class, [...]);

无论是办法这里建议这么做是为了我。但是这个解决我的问题

@XmlAnyElement(lax = true)
public List<Foo> foos;

同步的条款,上述解决的问题,以及对我来说,但似乎喜欢的上下文中不应当地的变量。相反,它应该是一个实例变,或者一个静态的。我是不是能够进行重构,我的代码如何我喜欢它,而不是我移动的背景下进入一个静态的初始值,这不是完美的,但是,似乎工作:

 private static Unmarshaller um;

  static{
    try {
      final JAXBContext ctx = JAXBContext.newInstance(ObjectFactory.class.getPackage().getName());
      um = ctx.createUnmarshaller();
    } catch (final JAXBException e) {
      e.printStackTrace();
    }
  }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top