From cbabadeb3d46e02e867a16f7921596f90689e8c1 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 23 Jun 2020 16:03:17 -0700 Subject: [PATCH] Fixed #413 --- release-notes/CREDITS-2.x | 5 ++ release-notes/VERSION-2.x | 4 +- .../dataformat/xml/ser/ToXmlGenerator.java | 6 +- .../xml/stream/XmlGeneratorTest.java | 59 ++++++++++++------- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 14000f4d2..194edfc8a 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -65,3 +65,8 @@ Martin Vysny (mvysny@github) * Reported #395: Namespace repairing generates xmlns definitions for xml: prefix (which is implicit) (2.10.5) + +James Bushell (jimnz111@github) + +* Suggested #413: Null String field serialization through ToXmlGenerator causes NullPointerException + (2.10.5) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 13fd6e29c..9d351282a 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -8,7 +8,9 @@ Project: jackson-dataformat-xml #395: Namespace repairing generates xmlns definitions for xml: prefix (which is implicit) (reported by Martin V) -- Upgrade Woodstox dependency to 6.2.0 (minor fix to namespace binding) +#413: Null String field serialization through ToXmlGenerator causes NullPointerException + (suggested by James B) +- Upgrade Woodstox dependency to 6.2.1 2.10.4 (03-May-2020) diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java index b67db9105..17f894d51 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java @@ -590,10 +590,14 @@ public void writeFieldName(SerializableString name) throws IOException { writeFieldName(name.getValue()); } - + @Override public void writeString(String text) throws IOException { + if (text == null) { // [dataformat-xml#413] + writeNull(); + return; + } _verifyValueWrite("write String value"); if (_nextName == null) { handleMissingName(); diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java index 5d3d20a12..f6ff0f882 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java @@ -12,11 +12,12 @@ public class XmlGeneratorTest extends XmlTestBase { + private final XmlFactory XML_F = new XmlFactory(); + public void testSimpleElement() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -30,11 +31,37 @@ public void testSimpleElement() throws Exception assertEquals("value", xml); } + public void testNullValuedElement() throws Exception + { + // First explicitly written + StringWriter out = new StringWriter(); + ToXmlGenerator gen = XML_F.createGenerator(out); + gen.setNextName(new QName("root")); + gen.writeStartObject(); + gen.writeFieldName("elem"); + gen.writeNull(); + gen.writeEndObject(); + gen.close(); + String xml = removeSjsxpNamespace(out.toString()); + assertEquals("", xml); + + // and then indirectly (see [dataformat-xml#413]) + out = new StringWriter(); + gen = XML_F.createGenerator(out); + gen.setNextName(new QName("root")); + gen.writeStartObject(); + gen.writeFieldName("elem"); + gen.writeString((String) null); + gen.writeEndObject(); + gen.close(); + xml = removeSjsxpNamespace(out.toString()); + assertEquals("", xml); + } + public void testSimpleAttribute() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -52,9 +79,8 @@ public void testSimpleAttribute() throws Exception public void testSecondLevelAttribute() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); gen.setNextName(new QName("root")); gen.writeStartObject(); gen.writeFieldName("elem"); @@ -74,9 +100,8 @@ public void testSecondLevelAttribute() throws Exception public void testAttrAndElem() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); gen.setNextName(new QName("root")); gen.writeStartObject(); // and also need to force attribute @@ -109,9 +134,8 @@ public void testWriteToFile() throws Exception public void testRawSimpleValue() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -127,9 +151,8 @@ public void testRawSimpleValue() throws Exception public void testRawOffsetValue() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -145,9 +168,8 @@ public void testRawOffsetValue() throws Exception public void testRawCharArrayValue() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -163,9 +185,8 @@ public void testRawCharArrayValue() throws Exception public void testRawSimpleAttribute() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -183,9 +204,8 @@ public void testRawSimpleAttribute() throws Exception public void testRawOffsetAttribute() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject(); @@ -203,9 +223,8 @@ public void testRawOffsetAttribute() throws Exception public void testRawCharArratAttribute() throws Exception { - XmlFactory f = new XmlFactory(); StringWriter out = new StringWriter(); - ToXmlGenerator gen = f.createGenerator(out); + ToXmlGenerator gen = XML_F.createGenerator(out); // root name is special, need to be fed first: gen.setNextName(new QName("root")); gen.writeStartObject();