Мы столкнулись с чрезвычайно трудной для отслеживания проблемой, когда мы видим ClassCastExceptions иногда при попытке выполнить итерацию по списку неупорядоченных объектов. Важным моментом является то, что иногда после перезагрузки конкретный код работает нормально. Кажется, это указывает на условия параллелизма/времени/гонки. Я могу подтвердить, что ни JAXBContext, ни marshallers и unmarshallers не используются одновременно. Мы дошли до сериализации доступа к ним через блокировку.
Однако, поскольку мы работаем на платформе OSGi, где отдельные пакеты инициализируются асинхронно через Spring DM, может случиться так, что два разных пакета создают свой JAXBContext одновременно.
В любом случае я был бы признателен за любые указания на объяснение того, что могло вызвать эти прерывистые исключения ClassCastException. Прерывистость важна, так как она указывает на то, что сам код нормально работает, но на его поведение, по-видимому, влияет какой-то внешний фактор.
Вот конкретный пример исключения (обратите внимание, что я удалил специфические для компании материалы):
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 представляет собой конструкцию for(), перебирающую коллекцию объектов TunnelType внутри неупорядоченного объекта (кстати, указанная неупорядоченность работает нормально).
Учитывая, что фактический демаршалинг объектов прошел нормально, возможно ли физически для JAXB оставить объекты ElementNSImpl внутри вложенных коллекций?
Среда выполнения:
- JAXB 2.1
- OSGi
- Весна ДМ
- JAXBContext инициализируется с помощью ClassLoader пакета, содержащего классы, подлежащие маршаллингу/демаршаллингу.