间歇性ClassCastException从ElementNSImpl到自己在解组
-
22-08-2019 - |
题
我们正在经历一个极其难以追踪的问题,我们看到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();
}
}