Error marshalling JaxbXmlPart /word/document.xml

392 Views Asked by At

I have an issue with the saving of a docx4j document to an OutputStream and I´m not sure how I should debug it.

I'm using 8.3.8 for both docx4j-ImportXHTML and docx4j for java 8.

In general I´m parsing an html document to docx4j and saving it to an OutputStream, i.e.

WordprocessingMLPackage docx = WordprocessingMLPackage.createPackage();
DocumentPart docPart = docx.getMainDocumentPart();
docPart.getContent().addAll(new XHTMLImporterImpl(docx).convert(htmlString, null));
docx.save(myOutputStream);.

Not alwasy, this process crashes while someothers it works fine. So I can't reproduce it always.

I have logged out org.docx4j.openpackaging, since there seems to be the error, but I'm not sure how to fix it. The logs give the following result:

2022-07-25 13:22:45 [http-thread-pool::http-listener-1(2)] | [514b616a-9211-4aae-a60a-affe61ff3d2f SuperUser user ]                                                   | DEBUG in org.docx4j.openpackaging.io3.stores.ZipPartStore -> marshalling /word/document.xml 
2022-07-25 13:22:45 [http-thread-pool::http-listener-1(2)] | [514b616a-9211-4aae-a60a-affe61ff3d2f SuperUser user ]                                                   | DEBUG in org.docx4j.openpackaging.parts.JaxbXmlPart -> marshalling org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart 
2022-07-25 13:22:45 [http-thread-pool::http-listener-1(2)] | [514b616a-9211-4aae-a60a-affe61ff3d2f SuperUser user ]                                                   | DEBUG in org.docx4j.openpackaging.parts.JaxbXmlPart -> Marshalling to org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream 
2022-07-25 13:22:45 [http-thread-pool::http-listener-1(2)] | [514b616a-9211-4aae-a60a-affe61ff3d2f SuperUser user ]                                                   | DEBUG in org.docx4j.openpackaging.parts.Part -> package name: null 
2022-07-25 13:22:45 [http-thread-pool::http-listener-1(2)] | [514b616a-9211-4aae-a60a-affe61ff3d2f SuperUser user ]                                                   | DEBUG in org.docx4j.openpackaging.parts.Part -> package name: null 
2022-07-25 13:22:45 [http-thread-pool::http-listener-1(2)] | [514b616a-9211-4aae-a60a-affe61ff3d2f SuperUser user ]                                                   | ERROR in org.docx4j.openpackaging.io3.Save -> Error marshalling JaxbXmlPart /word/document.xml 
org.docx4j.openpackaging.exceptions.Docx4JException: Error marshalling JaxbXmlPart /word/document.xml
    at org.docx4j.openpackaging.io3.stores.ZipPartStore.saveJaxbXmlPart(ZipPartStore.java:394)
    at org.docx4j.openpackaging.io3.Save.saveRawXmlPart(Save.java:289)
    at org.docx4j.openpackaging.io3.Save.savePart(Save.java:436)
    at org.docx4j.openpackaging.io3.Save.addPartsFromRelationships(Save.java:399)
    at org.docx4j.openpackaging.io3.Save.save(Save.java:193)
    at org.docx4j.openpackaging.packages.OpcPackage.save(OpcPackage.java:799)
    at org.docx4j.openpackaging.packages.OpcPackage.save(OpcPackage.java:729)
    at org.docx4j.openpackaging.packages.OpcPackage.save(OpcPackage.java:717)
    at myClass.save2Docx(MyClass.java:69)
    ...
Caused by: javax.xml.bind.JAXBException: null
    at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:937)
    at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:748)
    at org.docx4j.openpackaging.io3.stores.ZipPartStore.saveJaxbXmlPart(ZipPartStore.java:337)
    ... 89 common frames omitted
Caused by: javax.xml.bind.MarshalException: null
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:303)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:226)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:80)
    at org.docx4j.openpackaging.parts.JaxbXmlPart.marshal(JaxbXmlPart.java:865)
    ... 91 common frames omitted
Caused by: java.io.IOException: Connection is closed
    at org.glassfish.grizzly.nio.NIOConnection.assertOpen(NIOConnection.java:445)
    at org.glassfish.grizzly.http.io.OutputBuffer.write(OutputBuffer.java:677)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:336)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:323)
    ...
Caused by: java.io.IOException: An established connection was aborted by the software in your host machine
    at sun.nio.ch.SocketDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
    at sun.nio.ch.IOUtil.write(IOUtil.java:51)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
    ...

While debugging on docx.save(myOutputStream); it shows me an exception:

org.docx4j.openpackaging.exceptions.Docx4JException: Problem saving part /word/document.xml
Failed to add parts from relationships of /

I'm not sure how to approach it in order to solve it.

Thanks in advance

1

There are 1 best solutions below

0
Symeon Mattes On

Not sure why it works, but I'm writing in case somebody else has the same issue.

I had the following in my code:

        StreamingOutput myOutput = out -> generateDocx(htmlString, out);

and changed it to:

StreamingOutput myOutput = new StreamingOutput() {
                @Override
                public void write(OutputStream outputStream) throws IOException, WebApplicationException {
                    generateDocx(htmlString, outputStream);
                }
            };

This code is on top of osgi framework, and for some reason the lambda expression close the connection...not sure why it happens.