Binder<Node> binder = myContext.createBinder();
binder.unmarshal( doc ); // org.w3c.dom.Document
Usually (ie for most input dom documents using this method) this works fine.
But for some dom docs, it throws a ClassCastException
java.lang.ClassCastException: org.docx4j.wml.PPr cannot be cast to
javax.xml.bind.JAXBElement
at com.sun.xml.internal.bind.v2.runtime.ElementBeanInfoImpl$IntercepterLoader.intercept(ElementBeanInfoImpl.java:230)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:522)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.InterningXmlVisitor.endElement(InterningXmlVisitor.java:66)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:143)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:239)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:265)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:234)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:265)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:234)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:265)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:234)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:265)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:234)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:111)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:94)
at com.sun.xml.internal.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:87)
at com.sun.xml.internal.bind.v2.runtime.BinderImpl.associativeUnmarshal(BinderImpl.java:145)
at com.sun.xml.internal.bind.v2.runtime.BinderImpl.unmarshal(BinderImpl.java:116)
If I replace the Binder with an Unmarshaller:
Unmarshaller u = jc.createUnmarshaller();
u.unmarshal( doc );
for this troublesome dom doc, unmarshalling is successful.
So something specific to the binder is going wrong.
We've encountered a very similar exception, when using Unmarshaller (and not Binder). Here's the stack trace:
Caused by: java.lang.ClassCastException: com.sundaysky.dvg.renderer.vsml.core.parser.v0_9.xmltypes.VsmlHeadType cannot be cast to javax.xml.bind.JAXBElement
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$IntercepterLoader.intercept(ElementBeanInfoImpl.java:199)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:437)
at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.endElement(ValidatingUnmarshaller.java:79)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:109)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:195)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at com.sundaysky.dvg.renderer.tpl.parser.TplParser.parseFile(TplParser.java:186)
at com.sundaysky.dvg.renderer.Renderer.render(Renderer.java:149)
... 7 more
Note that this doesn't happen consistently - it seems like sometimes the intercept method receives a state whose "target" field is an actual bound class type, and sometimes it receives a JAXBElement. We were unable to determine any deterministic rule that defines when this happens.