XmlMapper with `FAIL_ON_UNKNOWN_PROPERTIES` fails on whitespace-only element

未关闭
#892 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

@arimu1 已经在做这个了。

开始于 2026年8月17日。

  • #898 来自 @arimu1 —— 未关闭

评估

难度
3/5
预计耗时
1-2 天
新手友好度
68/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
冷清
技术栈
java
领域
backend

调研方向

从 JacksonXmlWhitespaceOnlyContentTest.deserializesWhitespaceOnlyElementContent reproduction 以及配置了 FAIL_ON_UNKNOWN_PROPERTIES 的 XmlMapper builder 开始。跟踪 Item 内仅包含空白字符的内容如何变成一个名称为空的属性。完成的标准是测试通过,同时真正的未知属性仍然失败。

由索引模型根据 Issue 内容生成。

描述

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

主要语言
Java
星标
636
派生
250
平均合并
7 小时 10 分钟
30 天内合并 PR
8

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

FasterXML/jackson-dataformat-xml 的其他 Issue

查看 FasterXML/jackson-dataformat-xml 的全部 Issue

相似的 Issue

更多 Java Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。