Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ClassCastException across modules with org.eclipse.persistence.oxm.XMLBinder #2346

Open
Nishanth-GH opened this issue Jan 14, 2025 · 1 comment

Comments

@Nishanth-GH
Copy link

Nishanth-GH commented Jan 14, 2025

I am trying to read a docx file and replace the author names with a constant string.
The library i'm using to manipulate docx files is Docx4j-Moxy. This library uses org.eclipse.persistence:org.eclipse.persistence.moxy.

When there is any shape element in the docx file, the below error is coming up.

Exception in thread "main" java.lang.ClassCastException: class org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape cannot be cast to class org.eclipse.persistence.internal.oxm.Root (org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape and org.eclipse.persistence.internal.oxm.Root are in unnamed module of loader 'app') at org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecordImpl.addXsiTypeAndClassIndicatorIfRequired(AbstractMarshalRecordImpl.java:211) at org.eclipse.persistence.oxm.record.XMLRecord.addXsiTypeAndClassIndicatorIfRequired(XMLRecord.java:406) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:462) at org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.buildCompositeRow(XMLAnyCollectionMapping.java:683) at org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.writeFromObjectIntoRow(XMLAnyCollectionMapping.java:554) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405) at org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.buildCompositeRow(XMLAnyCollectionMapping.java:683) at org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.writeFromObjectIntoRow(XMLAnyCollectionMapping.java:554) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.writeFromObjectIntoRow(XMLCompositeCollectionMapping.java:463) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405) at org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405) at org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405) at org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425) at org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405) at org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680) at org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465) at org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:441) at org.eclipse.persistence.oxm.XMLBinder.updateXML(XMLBinder.java:189) at org.eclipse.persistence.jaxb.JAXBBinder.updateXML(JAXBBinder.java:145) at org.eclipse.persistence.jaxb.JAXBBinder.updateXML(JAXBBinder.java:133) at org.docx4j.XmlUtils.getJAXBAssociationsForXPath(XmlUtils.java:1611) at org.docx4j.XmlUtils.getJAXBNodesViaXPath(XmlUtils.java:1556) at org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.getJAXBNodesViaXPath(JaxbXmlPartXPathAware.java:211) at core.example.sf.App.removeUserInfo(App.java:44) at core.example.sf.App.main(App.java:27)

In AbstractMarshalRecordImpl.java:211 we are casting org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape to org.eclipse.persistence.internal.oxm.Root which is causing the exception.

I have tried the alternative docx4j-JAXB-ReferenceImpl instead of docx4j-JAXB-MOXy which doesn't cause the issue. ReferenceImpl uses org.glassfish.jaxb.runtime.v2.runtime.BinderImpl instead of JAXBBinder.

I have uploaded a light weight maven project where issue could be replicated.(It also has input .docx file that causes the issue)
Project link
Stack overflow query link

@plutext
Copy link

plutext commented Jan 20, 2025

Per https://stackoverflow.com/a/79370090/1031689 this problem is triggered by annotation @XmlAnyElement(lax = true)

This is in the docx4j class:

public class GraphicData
{

@XmlAnyElement(lax = true)
protected List<Object> any = new ArrayListDml<Object>(this);

It would work if it instead said, for example:

@XmlElements({
@xmlelement(name = "wsp", namespace = "http://schemas.microsoft.com/office/word/2010/wordprocessingShape", type = CTWordprocessingShape.class),
})
protected List any = new ArrayListDml(this);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants