Intermittierende classcastexception-Fehler aus ElementNSImpl zum eigenen Typ beim unmarshalling

Erleben wir eine überaus schwer aufzuspüren Problem, wo wir sehen ClassCastExceptions manchmal, wenn Sie versuchen zu iterieren über eine Liste von unmarshallt Objekte. Der wichtige Teil ist manchmal, nach einem Neustart ist der Quellcode funktioniert einwandfrei. Das scheint in die Richtung des concurrency - /timing - /race-Bedingung. Ich kann bestätigen, dass weder der JAXBContext, noch die marshallers und unmarshallers werden gleichzeitig verwendet. Wir haben so weit gegangen wie mit der Serialisierung der Zugang zu Ihnen durch sperren.

Jedoch, da wir auf eine OSGi-Plattform, wo die einzelnen Bündel sind immer initialisiert asynchron durch Spring DM kann es sein, dass 2 verschiedene bundles erstellen Ihre JAXBContext zur gleichen Zeit.

In jedem Fall, ich würde schätzen, irgendwelche Hinweise auf eine Erklärung für das, was könnte dazu führen, dass diese intermittierende ClassCastExceptions. Die intermittierende ist wichtig, da Sie zeigen, dass der code an sich ist der Regel funktioniert gut, aber, dass einige externe Faktor scheint Einfluss auf das Verhalten.

Hier ist ein konkretes Beispiel für die Ausnahme (Hinweis habe ich entfernt, das Unternehmen spezielle Sachen):

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)

Dass die Methode in Zeile 180 ist eine for () - Konstrukt Durchlaufen einer Sammlung von TunnelType Objekte, die sich innerhalb eines unmarshallt Objekt (sagte unmarshalling funktioniert gut, BTW).

Gegeben, dass das eigentliche Objekt unmarshalling gelaufen ist, ist es auch physisch möglich für JAXB zu verlassen ElementNSImpl Objekte innerhalb eines geschachtelten Kollektionen?

Runtime environment:

  • JAXB 2.1
  • OSGi
  • Spring DM
  • Der JAXBContext ist initialisiert mit dem ClassLoader des Bundles, das die Klassen enthält, umgewandelt werden/unmarshallt

InformationsquelleAutor Boris Terzic | 2008-12-18

Schreibe einen Kommentar