XmlMapper with `FAIL_ON_UNKNOWN_PROPERTIES` fails on whitespace-only element

Offen
#892 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

@arimu1 arbeitet bereits daran.

Seit 17.8.2026.

  • #898 von @arimu1 — offen

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
68/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Ruhig
Tech-Stack
java
Bereich
backend

Rechercherichtung

Beginne mit der Reproduktion JacksonXmlWhitespaceOnlyContentTest.deserializesWhitespaceOnlyElementContent und dem XmlMapper-Builder, der mit FAIL_ON_UNKNOWN_PROPERTIES konfiguriert ist. Verfolge, wie der Inhalt, der nur aus Leerraum besteht, innerhalb von Item zu einer Eigenschaft mit leerem Namen wird. Die Aufgabe ist erledigt, wenn der Test besteht, während echte unbekannte Eigenschaften weiterhin fehlschlagen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

to-evaluate
Search before asking
  • I searched in the issues and found nothing similar.
Describe the bug

Take this XML:

<Response>
	<Item name="example">
	</Item>
</Response>

If I want to deserialize that Item element into record Item(String name), I'm faced with this error:

Unrecognized property "" (class me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest$Item), not marked as ignorable (one known property: "name")
 at [No location information] (through reference chain: me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest$Response["Item"]->me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest$Item[""])
tools.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized property "" (class me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest$Item), not marked as ignorable (one known property: "name")
 at [No location information] (through reference chain: me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest$Response["Item"]->me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest$Item[""])
	at tools.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
	at tools.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1378)
	at tools.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2099)
	at tools.jackson.databind.deser.bean.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:2032)
	at tools.jackson.databind.deser.bean.BeanDeserializerBase.handleUnknownProperties(BeanDeserializerBase.java:1957)
	at tools.jackson.databind.deser.bean.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:922)
	at tools.jackson.databind.deser.bean.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1695)
	at tools.jackson.databind.deser.bean.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:629)
	at tools.jackson.databind.deser.bean.BeanDeserializer.deserialize(BeanDeserializer.java:200)
	at tools.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:568)
	at tools.jackson.databind.deser.bean.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:943)
	at tools.jackson.databind.deser.bean.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:775)
	at tools.jackson.databind.deser.bean.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1695)
	at tools.jackson.databind.deser.bean.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:629)
	at tools.jackson.databind.deser.bean.BeanDeserializer.deserialize(BeanDeserializer.java:200)
	at tools.jackson.dataformat.xml.deser.XmlDeserializationContext.readRootValue(XmlDeserializationContext.java:69)
	at tools.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2666)
	at tools.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1556)
	at me.retrodaredevil.randomjunkk.JacksonXmlWhitespaceOnlyContentTest.deserializesWhitespaceOnlyElementContent(JacksonXmlWhitespaceOnlyContentTest.java:27)

This is an issue for more complicated XML data, specifically data like this:

<Item name="thing">
    <AnotherElement name="thing"/>
</Item>

I run into this problem because Item typically has nested elements inside of it, but when it doesn't, the whitespace data within it is treated as a special blank string property.

Version Information

Jackson 3.2.1

Reproduction
import com.fasterxml.jackson.annotation.JsonProperty;
import org.junit.jupiter.api.Test;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.dataformat.xml.XmlMapper;

import static org.junit.jupiter.api.Assertions.assertEquals;

class JacksonXmlWhitespaceOnlyContentTest {

	// This test fails because whitespace-only element content is exposed as an empty-named property.
	@Test
	void deserializesWhitespaceOnlyElementContent() {
		XmlMapper mapper = XmlMapper.builder()
				.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
				.build();
		String xml = """
				<Response>
					<Item name="example">
					</Item>
				</Response>
				""";

		Response response = mapper.readValue(xml, Response.class);

		assertEquals(new Item("example"), response.item());
	}

	record Response(
			@JsonProperty("Item") Item item
	) {
	}

	record Item(String name) {
	}
}
Expected behavior

FAIL_ON_UNKNOWN_PROPERTIES should only cause failures when there are actual properties that are unknown. I don't think this weird empty string property edge case should cause a failure here.

Additional context

No response

Vorherrschende Sprache
Java
Sterne
636
Forks
250
Ø Merge
7 Std. 10 Min.
Gemergte PRs (30 T.)
8

Entwicklungsumgebung

Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus FasterXML/jackson-dataformat-xml

Alle Issues in FasterXML/jackson-dataformat-xml

Ähnliche Issues

Weitere Issues zu Java

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.