Skip to content

Commit 82dfb24

Browse files
committed
Fixed #411
1 parent a379cab commit 82dfb24

File tree

4 files changed

+25
-20
lines changed

4 files changed

+25
-20
lines changed

release-notes/VERSION-2.x

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Project: jackson-dataformat-xml
2424
#397: `XmlReadContext` does not keep track of array index
2525
#403: Make `JsonNode` implicitly create `ArrayNode`s for repeated XML Elements
2626
#405: Mixed content not exposed through `FromXmlParser`, lost by `JsonNode`
27+
#411: Change default setting of `FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL`
28+
from `true` to `false`
2729

2830
2.11.1 (not yet released)
2931

@@ -85,7 +87,7 @@ No changes since 2.10.x
8587
(reported by Sam S)
8688
#351: XmlBeanSerializer serializes AnyGetters field even with FilterExceptFilter
8789
(reported by Rohit N)
88-
#354: Support mapping `xsi:nul` marked elements as `null`s (`JsonToken.VALUE_NULL`)
90+
#354: Support mapping `xsi:nil` marked elements as `null`s (`JsonToken.VALUE_NULL`)
8991
9092
2.9.10 (not yet released)
9193

src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,12 @@ public enum Feature implements FormatFeature
5555
* returned as `null` tokens, they will be returned as {@link JsonToken#VALUE_STRING}
5656
* tokens with textual value of "" (empty String).
5757
*<p>
58-
* Default setting is `true` for backwards compatibility.
58+
* Default setting was {@code true} (for backwards compatibility from 2.9 to 2.11 (inclusive)
59+
* but was changed in 2.12 to be {@code false} (see [dataformat-xml#411] for details)
5960
*
6061
* @since 2.9
6162
*/
62-
EMPTY_ELEMENT_AS_NULL(true)
63+
EMPTY_ELEMENT_AS_NULL(false)
6364
;
6465

6566
final boolean _defaultState;
@@ -736,11 +737,7 @@ public String nextTextValue() throws IOException
736737
return null;
737738
}
738739
if (_parsingContext.inArray()) {
739-
try {
740-
token = _xmlTokens.next();
741-
} catch (XMLStreamException e) {
742-
StaxUtil.throwAsParseException(e, this);
743-
}
740+
token = _nextToken();
744741
_mayBeLeaf = true;
745742
continue;
746743
}

src/test/java/com/fasterxml/jackson/dataformat/xml/deser/EmptyStringValueTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,20 @@ public void testEmptyString162() throws Exception
4343
public void testEmptyElement() throws Exception
4444
{
4545
final String XML = "<name><first/><last></last></name>";
46-
// Default settings: empty element becomes `null`:
46+
47+
// Default settings (since 2.12): empty element does NOT become `null`:
4748
Name name = MAPPER.readValue(XML, Name.class);
4849
assertNotNull(name);
49-
assertNull(name.first);
50+
assertEquals("", name.first);
5051
assertEquals("", name.last);
5152

5253
// but can be changed
53-
XmlMapper mapper2 = new XmlMapper();
54-
mapper2.disable(FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL);
54+
XmlMapper mapper2 = XmlMapper.builder()
55+
.enable(FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL)
56+
.build();
5557
name = mapper2.readValue(XML, Name.class);
5658
assertNotNull(name);
57-
assertEquals("", name.first);
59+
assertNull(name.first);
5860
assertEquals("", name.last);
5961
}
6062

src/test/java/com/fasterxml/jackson/dataformat/xml/deser/NullConversionsSkipTest.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ public void setValue(String v) {
4444
/**********************************************************
4545
*/
4646

47-
private final XmlMapper MAPPER = newMapper();
47+
private final XmlMapper NULL_EXPOSING_MAPPER = mapperBuilder()
48+
.enable(FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL)
49+
.build();
4850

4951
public void testSkipNullField1() throws Exception
5052
{
5153
// first, ok if assigning non-null to not-nullable, null for nullable
52-
NullSkipField result = MAPPER.readValue(
54+
NullSkipField result = NULL_EXPOSING_MAPPER.readValue(
5355
//"<NullSkipField><noNulls>foo</noNulls><nullsOk></nullsOk></NullSkipField>",
5456
"<NullSkipField><noNulls>foo</noNulls><nullsOk /></NullSkipField>",
5557
NullSkipField.class);
@@ -60,15 +62,15 @@ public void testSkipNullField1() throws Exception
6062
public void testSkipNullField2() throws Exception
6163
{
6264
// and then see that nulls are not ok for non-nullable
63-
NullSkipField result = MAPPER.readValue("<NullSkipField><noNulls /></NullSkipField>",
65+
NullSkipField result = NULL_EXPOSING_MAPPER.readValue("<NullSkipField><noNulls /></NullSkipField>",
6466
NullSkipField.class);
6567
assertEquals("b", result.noNulls);
6668
assertEquals("a", result.nullsOk);
6769
}
6870

6971
public void testSkipNullMethod1() throws Exception
7072
{
71-
NullSkipMethod result = MAPPER.readValue(
73+
NullSkipMethod result = NULL_EXPOSING_MAPPER.readValue(
7274
//"<NullSkipMethod><noNulls>foo<noNulls><nullsOk></nullsOk></NullSkipMethod>",
7375
"<NullSkipMethod><noNulls>foo</noNulls><nullsOk /></NullSkipMethod>",
7476
NullSkipMethod.class);
@@ -78,7 +80,7 @@ public void testSkipNullMethod1() throws Exception
7880

7981
public void testSkipNullMethod2() throws Exception
8082
{
81-
NullSkipMethod result = MAPPER.readValue("<NullSkipMethod><noNulls /></NullSkipMethod>",
83+
NullSkipMethod result = NULL_EXPOSING_MAPPER.readValue("<NullSkipMethod><noNulls /></NullSkipMethod>",
8284
NullSkipMethod.class);
8385
assertEquals("b", result._noNulls);
8486
assertEquals("a", result._nullsOk);
@@ -94,10 +96,12 @@ public void testSkipNullWithDefaults() throws Exception
9496
{
9597
// String doc = "<StringValue><value></value></StringValue>";
9698
String doc = "<StringValue><value /></StringValue>";
97-
StringValue result = MAPPER.readValue(doc, StringValue.class);
99+
StringValue result = NULL_EXPOSING_MAPPER.readValue(doc, StringValue.class);
98100
assertNull(result.value);
99101

100-
ObjectMapper mapper = newMapper();
102+
ObjectMapper mapper = mapperBuilder()
103+
.enable(FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL)
104+
.build();
101105
mapper.configOverride(String.class)
102106
.setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP));
103107
result = mapper.readValue(doc, StringValue.class);

0 commit comments

Comments
 (0)