diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 42f78d21..15f05928 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -287,3 +287,6 @@ Sahana (@Sahana2524) * Contributed #891: Enforce `StreamReadConstraints.maxNestingDepth` in `FromXmlParser` (2.18.10) +* Fixed #899: Return `null` from `nextTextValue()` at end-of-input (instead of + throwing `IllegalStateException`) + (2.23.0) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 00e4f6bd..712f5503 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -6,7 +6,9 @@ Project: jackson-dataformat-xml 2.23.0 (not yet released) -No changes since 2.22 +#899: Return `null` from `nextTextValue()` at end-of-input (instead of + throwing `IllegalStateException`) + (fix by @Sahana2524) 2.22.2 (16-Aug-2026) 2.22.1 (07-Jul-2026) diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java index 1afd42dd..8a9273e1 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java @@ -1052,6 +1052,7 @@ public String nextTextValue() throws IOException break; case XmlTokenStream.XML_END: _updateTokenToNull(); + break; default: return _internalErrorUnknownToken(token); } diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java index 93ea9e35..e2d75fd0 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParserNextXxxTest.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class XmlParserNextXxxTest extends XmlTestUtil { @@ -57,4 +58,26 @@ public void testXmlAttributesWithNextTextValue() throws Exception assertToken(JsonToken.END_OBJECT, xp.nextToken()); // xp.close(); } + + // [dataformat-xml#899]: nextTextValue() must honor the JsonParser contract + // at end of input: return null, same as nextToken() does, instead of leaking + // an unchecked IllegalStateException from the internal XML_END branch. + @Test + public void testNextTextValueAtEndOfInput() throws Exception + { + final String XML = ""; + + FromXmlParser xp = (FromXmlParser) _xmlFactory.createParser(new StringReader(XML)); + + assertToken(JsonToken.START_OBJECT, xp.nextToken()); // + assertToken(JsonToken.FIELD_NAME, xp.nextToken()); // max + assertEquals("7", xp.nextTextValue()); + assertToken(JsonToken.FIELD_NAME, xp.nextToken()); // offset + assertEquals("9", xp.nextTextValue()); + assertToken(JsonToken.END_OBJECT, xp.nextToken()); // + + // One more call past the end: should quietly report end-of-input + assertNull(xp.nextTextValue()); + xp.close(); + } }