user304611
user304611

Reputation: 337

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

I am trying to read a docx file and replace the author names with a constant string.

This is the code in my main function.

import jakarta.xml.bind.JAXBException;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.CTTrackChange;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;


public class App {

    public static void main(String[] args) throws IOException, Docx4JException {
        try {
            // Replace "path/to/your/document.docx" with the actual file path
            String inputFilePath = "src/main/java/shapes.docx";
            String outputFilePath = "output_no_user_info.docx";

            // Load the document
            WordprocessingMLPackage wmlPackage = WordprocessingMLPackage.load(new File(inputFilePath));

            // Remove user information
            removeUserInfo(wmlPackage);

            // Save the modified document
            FileOutputStream fos = new FileOutputStream(outputFilePath);
            wmlPackage.save(fos);
            fos.close();

            System.out.println("User information removed successfully. Saved as: " + outputFilePath);

        } catch (Docx4JException | JAXBException e) {
            e.printStackTrace();
            System.err.println("Error processing the document: " + e.getMessage());
        }
    }

    public static void removeUserInfo(WordprocessingMLPackage wmlPackage) throws Docx4JException, JAXBException {
        MainDocumentPart documentPart = wmlPackage.getMainDocumentPart();
        List<Object> trackedChanges = documentPart.getJAXBNodesViaXPath("//w:ins | //w:del", true);

        for (Object change : trackedChanges) {
            if (change instanceof CTTrackChange) {
                CTTrackChange trackChange = (CTTrackChange) change;
                trackChange.setAuthor("External");
            }
        }
    }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>Docx4jTest</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>Archetype - Docx4jTest</name>
  <url>http://maven.apache.org</url>


  <dependencies>
    <dependency>
      <groupId>org.docx4j</groupId>
      <artifactId>docx4j-core</artifactId>
      <version>11.4.9</version>
    </dependency>
    <dependency>
      <groupId>org.docx4j</groupId>
      <artifactId>docx4j-JAXB-MOXy</artifactId>
      <version>11.4.5</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.moxy</artifactId>
      <version>4.0.2</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.11.0</version>
        <configuration>
          <source>11</source>
          <target>11</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

The error i'm observing is the below one and it's coming up when there are any shapes in the document. I see CTWordprocessingShape and org.eclipse.persistence.internal.oxm.Root are different classes to be cast and code is breaking in this line of (AbstractMarshalRecordImpl:211).

     Root xr = (Root) originalObject;

Link to code for AbstractMarshalRecordImpl:- https://github.com/eclipse-ee4j/eclipselink/blob/7457271b1829f56746c91197a4d3a643b1da9e60/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/AbstractMarshalRecordImpl.java

I'm fairly new to library and please let me know if there is any work around to bypass the issue.

I tried using ReferenceImpl instead of Moxy, ReferenceImpl doesn't cause the below issue.

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 is in module org.docx4j.openxml_objects of loader 'app'; org.eclipse.persistence.internal.oxm.Root is in module [email protected] of loader 'app')
    at [email protected]/org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecordImpl.addXsiTypeAndClassIndicatorIfRequired(AbstractMarshalRecordImpl.java:211)
    at [email protected]/org.eclipse.persistence.oxm.record.XMLRecord.addXsiTypeAndClassIndicatorIfRequired(XMLRecord.java:406)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:462)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.buildCompositeRow(XMLAnyCollectionMapping.java:683)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.writeFromObjectIntoRow(XMLAnyCollectionMapping.java:554)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.buildCompositeRow(XMLAnyCollectionMapping.java:683)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping.writeFromObjectIntoRow(XMLAnyCollectionMapping.java:554)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.writeFromObjectIntoRow(XMLCompositeCollectionMapping.java:463)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRowForDescriptor(XMLCompositeCollectionMapping.java:425)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping.buildCompositeRow(XMLCompositeCollectionMapping.java:405)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping.writeFromObjectIntoRow(XMLChoiceCollectionMapping.java:335)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:445)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRowForDescriptor(XMLCompositeObjectMapping.java:466)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.buildCompositeRow(XMLCompositeObjectMapping.java:447)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeSingleValue(XMLCompositeObjectMapping.java:680)
    at [email protected]/org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping.writeFromObjectIntoRow(XMLCompositeObjectMapping.java:645)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.writeOutMappings(XMLObjectBuilder.java:349)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:465)
    at [email protected]/org.eclipse.persistence.internal.oxm.XMLObjectBuilder.buildIntoNestedRow(XMLObjectBuilder.java:441)
    at [email protected]/org.eclipse.persistence.oxm.XMLBinder.updateXML(XMLBinder.java:189)
    at [email protected]/org.eclipse.persistence.jaxb.JAXBBinder.updateXML(JAXBBinder.java:145)
    at [email protected]/org.eclipse.persistence.jaxb.JAXBBinder.updateXML(JAXBBinder.java:133)
    at org.docx4j.core/org.docx4j.XmlUtils.getJAXBAssociationsForXPath(XmlUtils.java:1611)
    at org.docx4j.core/org.docx4j.XmlUtils.getJAXBNodesViaXPath(XmlUtils.java:1556)
    at org.docx4j.core/org.docx4j.openpackaging.parts.JaxbXmlPartXPathAware.getJAXBNodesViaXPath(JaxbXmlPartXPathAware.java:211)
    at core.example.sf/core.example.sf.App.removeUserInfo(App.java:44)
    at core.example.sf/core.example.sf.App.main(App.java:27)

Upvotes: 2

Views: 87

Answers (2)

JasonPlutext
JasonPlutext

Reputation: 15863

The problem is @XmlAnyElement(lax = true) in

public class GraphicData implements Child
{
    
    @XmlAnyElement(lax = true)
    protected List<Object> any = new ArrayListDml<Object>(this);

It would work if it instead said:

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

Upvotes: 1

JasonPlutext
JasonPlutext

Reputation: 15863

org.docx4j.com.microsoft.schemas.office.word.x2010.wordprocessingShape.CTWordprocessingShape and org.eclipse.persistence.internal.oxm.Root are in unnamed module of loader 'app' suggests a possible JPMS (modularisation) config issue at your end.

Works for me using docx4j-JAXB-MOXy and a module-info.java file which includes:

requires org.docx4j.JAXB_MOXy;

See example at https://github.com/plutext/docx4j/blob/VERSION_11_5_2/docx4j-samples-docx4j/src/main/java/module-info.java

Please note you only need docx4j-JAXB-MOXy; no need to also be adding docx4-core and org.eclipse.persistence.moxy. Also don't mix differing versions (you have 11.4.5 mixed with 11.4.9).

I tested with 11.5.1 on Java 17.

EDIT Doesn't work if org.eclipse.persistence.jaxb.JAXBBinder.updateXML is invoked.

Upvotes: 0

Related Questions