Skip to content

Commit cbabade

Browse files
committed
Fixed #413
1 parent d895334 commit cbabade

File tree

4 files changed

+52
-22
lines changed

4 files changed

+52
-22
lines changed

release-notes/CREDITS-2.x

+5
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,8 @@ Martin Vysny (mvysny@github)
6565

6666
* Reported #395: Namespace repairing generates xmlns definitions for xml: prefix (which is implicit)
6767
(2.10.5)
68+
69+
James Bushell (jimnz111@github)
70+
71+
* Suggested #413: Null String field serialization through ToXmlGenerator causes NullPointerException
72+
(2.10.5)

release-notes/VERSION-2.x

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ Project: jackson-dataformat-xml
88

99
#395: Namespace repairing generates xmlns definitions for xml: prefix (which is implicit)
1010
(reported by Martin V)
11-
- Upgrade Woodstox dependency to 6.2.0 (minor fix to namespace binding)
11+
#413: Null String field serialization through ToXmlGenerator causes NullPointerException
12+
(suggested by James B)
13+
- Upgrade Woodstox dependency to 6.2.1
1214

1315
2.10.4 (03-May-2020)
1416

src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -590,10 +590,14 @@ public void writeFieldName(SerializableString name) throws IOException
590590
{
591591
writeFieldName(name.getValue());
592592
}
593-
593+
594594
@Override
595595
public void writeString(String text) throws IOException
596596
{
597+
if (text == null) { // [dataformat-xml#413]
598+
writeNull();
599+
return;
600+
}
597601
_verifyValueWrite("write String value");
598602
if (_nextName == null) {
599603
handleMissingName();

src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java

+39-20
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212

1313
public class XmlGeneratorTest extends XmlTestBase
1414
{
15+
private final XmlFactory XML_F = new XmlFactory();
16+
1517
public void testSimpleElement() throws Exception
1618
{
17-
XmlFactory f = new XmlFactory();
1819
StringWriter out = new StringWriter();
19-
ToXmlGenerator gen = f.createGenerator(out);
20+
ToXmlGenerator gen = XML_F.createGenerator(out);
2021
// root name is special, need to be fed first:
2122
gen.setNextName(new QName("root"));
2223
gen.writeStartObject();
@@ -30,11 +31,37 @@ public void testSimpleElement() throws Exception
3031
assertEquals("<root><elem>value</elem></root>", xml);
3132
}
3233

34+
public void testNullValuedElement() throws Exception
35+
{
36+
// First explicitly written
37+
StringWriter out = new StringWriter();
38+
ToXmlGenerator gen = XML_F.createGenerator(out);
39+
gen.setNextName(new QName("root"));
40+
gen.writeStartObject();
41+
gen.writeFieldName("elem");
42+
gen.writeNull();
43+
gen.writeEndObject();
44+
gen.close();
45+
String xml = removeSjsxpNamespace(out.toString());
46+
assertEquals("<root><elem/></root>", xml);
47+
48+
// and then indirectly (see [dataformat-xml#413])
49+
out = new StringWriter();
50+
gen = XML_F.createGenerator(out);
51+
gen.setNextName(new QName("root"));
52+
gen.writeStartObject();
53+
gen.writeFieldName("elem");
54+
gen.writeString((String) null);
55+
gen.writeEndObject();
56+
gen.close();
57+
xml = removeSjsxpNamespace(out.toString());
58+
assertEquals("<root><elem/></root>", xml);
59+
}
60+
3361
public void testSimpleAttribute() throws Exception
3462
{
35-
XmlFactory f = new XmlFactory();
3663
StringWriter out = new StringWriter();
37-
ToXmlGenerator gen = f.createGenerator(out);
64+
ToXmlGenerator gen = XML_F.createGenerator(out);
3865
// root name is special, need to be fed first:
3966
gen.setNextName(new QName("root"));
4067
gen.writeStartObject();
@@ -52,9 +79,8 @@ public void testSimpleAttribute() throws Exception
5279

5380
public void testSecondLevelAttribute() throws Exception
5481
{
55-
XmlFactory f = new XmlFactory();
5682
StringWriter out = new StringWriter();
57-
ToXmlGenerator gen = f.createGenerator(out);
83+
ToXmlGenerator gen = XML_F.createGenerator(out);
5884
gen.setNextName(new QName("root"));
5985
gen.writeStartObject();
6086
gen.writeFieldName("elem");
@@ -74,9 +100,8 @@ public void testSecondLevelAttribute() throws Exception
74100

75101
public void testAttrAndElem() throws Exception
76102
{
77-
XmlFactory f = new XmlFactory();
78103
StringWriter out = new StringWriter();
79-
ToXmlGenerator gen = f.createGenerator(out);
104+
ToXmlGenerator gen = XML_F.createGenerator(out);
80105
gen.setNextName(new QName("root"));
81106
gen.writeStartObject();
82107
// and also need to force attribute
@@ -109,9 +134,8 @@ public void testWriteToFile() throws Exception
109134

110135
public void testRawSimpleValue() throws Exception
111136
{
112-
XmlFactory f = new XmlFactory();
113137
StringWriter out = new StringWriter();
114-
ToXmlGenerator gen = f.createGenerator(out);
138+
ToXmlGenerator gen = XML_F.createGenerator(out);
115139
// root name is special, need to be fed first:
116140
gen.setNextName(new QName("root"));
117141
gen.writeStartObject();
@@ -127,9 +151,8 @@ public void testRawSimpleValue() throws Exception
127151

128152
public void testRawOffsetValue() throws Exception
129153
{
130-
XmlFactory f = new XmlFactory();
131154
StringWriter out = new StringWriter();
132-
ToXmlGenerator gen = f.createGenerator(out);
155+
ToXmlGenerator gen = XML_F.createGenerator(out);
133156
// root name is special, need to be fed first:
134157
gen.setNextName(new QName("root"));
135158
gen.writeStartObject();
@@ -145,9 +168,8 @@ public void testRawOffsetValue() throws Exception
145168

146169
public void testRawCharArrayValue() throws Exception
147170
{
148-
XmlFactory f = new XmlFactory();
149171
StringWriter out = new StringWriter();
150-
ToXmlGenerator gen = f.createGenerator(out);
172+
ToXmlGenerator gen = XML_F.createGenerator(out);
151173
// root name is special, need to be fed first:
152174
gen.setNextName(new QName("root"));
153175
gen.writeStartObject();
@@ -163,9 +185,8 @@ public void testRawCharArrayValue() throws Exception
163185

164186
public void testRawSimpleAttribute() throws Exception
165187
{
166-
XmlFactory f = new XmlFactory();
167188
StringWriter out = new StringWriter();
168-
ToXmlGenerator gen = f.createGenerator(out);
189+
ToXmlGenerator gen = XML_F.createGenerator(out);
169190
// root name is special, need to be fed first:
170191
gen.setNextName(new QName("root"));
171192
gen.writeStartObject();
@@ -183,9 +204,8 @@ public void testRawSimpleAttribute() throws Exception
183204

184205
public void testRawOffsetAttribute() throws Exception
185206
{
186-
XmlFactory f = new XmlFactory();
187207
StringWriter out = new StringWriter();
188-
ToXmlGenerator gen = f.createGenerator(out);
208+
ToXmlGenerator gen = XML_F.createGenerator(out);
189209
// root name is special, need to be fed first:
190210
gen.setNextName(new QName("root"));
191211
gen.writeStartObject();
@@ -203,9 +223,8 @@ public void testRawOffsetAttribute() throws Exception
203223

204224
public void testRawCharArratAttribute() throws Exception
205225
{
206-
XmlFactory f = new XmlFactory();
207226
StringWriter out = new StringWriter();
208-
ToXmlGenerator gen = f.createGenerator(out);
227+
ToXmlGenerator gen = XML_F.createGenerator(out);
209228
// root name is special, need to be fed first:
210229
gen.setNextName(new QName("root"));
211230
gen.writeStartObject();

0 commit comments

Comments
 (0)