diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java index c81c36250..30dd1840f 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java @@ -658,7 +658,7 @@ ResourceAwareItemWriterItemStream, InitializingBean { finally { try { - eventWriter.close(); + delegateEventWriter.close(); } catch (XMLStreamException e) { log.error("Unable to close file resource: [" + resource + "] " + e); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentStreamWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentStreamWriter.java index 039b7b3de..dea26eb7e 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentStreamWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentStreamWriter.java @@ -39,4 +39,10 @@ public class NoStartEndDocumentStreamWriter extends AbstractEventWriterWrapper { wrappedEventWriter.add(event); } } + + // prevents OXM Marshallers from closing the XMLEventWriter + @Override + public void close() throws XMLStreamException { + flush(); + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java index a467fdaf7..df60339e1 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java @@ -726,6 +726,32 @@ public class StaxEventItemWriterTests { assertEquals("Wrong content: " + content, "", content); } + + /** + * Test with OXM Marshaller that closes the XMLEventWriter. + */ + // BATCH-2054 + @Test + public void testMarshallingClosingEventWriter() throws Exception { + writer.setMarshaller(new SimpleMarshaller() { + @Override + public void marshal(Object graph, Result result) throws XmlMappingException, IOException { + super.marshal(graph, result); + try { + StaxUtils.getXmlEventWriter(result).close(); + } catch (Exception e) { + throw new RuntimeException("Exception while writing to output file", e); + } + } + + }); + writer.afterPropertiesSet(); + + writer.open(executionContext); + + writer.write(items); + writer.write(items); + } /** * Writes object's toString representation as XML comment. diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentWriterTests.java index b0a1f1afd..1de835ede 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/stax/NoStartEndDocumentWriterTests.java @@ -7,6 +7,9 @@ import javax.xml.stream.events.XMLEvent; import junit.framework.TestCase; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; /** * Tests for {@link NoStartEndDocumentStreamWriter} @@ -44,4 +47,14 @@ public class NoStartEndDocumentWriterTests extends TestCase { writer.add(eventFactory.createEndDocument()); } + + /** + * Close is not delegated to the wrapped writer. Instead, the wrapped writer is flushed. + */ + public void testClose() throws Exception { + writer.close(); + + verify(wrappedWriter, times(1)).flush(); + verify(wrappedWriter, never()).close(); + } }