From 1c552624096097279a576af858469ea456bbbde5 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 28 Sep 2026 18:51:36 -0700 Subject: [PATCH] Fix XML side wrt databind/6136 change once it lands --- .../xml/ser/XmlBeanSerializerBase.java | 6 ++- .../xml/ser/SerializationWithFilterTest.java | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/main/java/tools/jackson/dataformat/xml/ser/XmlBeanSerializerBase.java b/src/main/java/tools/jackson/dataformat/xml/ser/XmlBeanSerializerBase.java index 479ecf87..ae292ebb 100644 --- a/src/main/java/tools/jackson/dataformat/xml/ser/XmlBeanSerializerBase.java +++ b/src/main/java/tools/jackson/dataformat/xml/ser/XmlBeanSerializerBase.java @@ -313,12 +313,14 @@ protected void _serializePropertiesFiltered(Object bean, JsonGenerator gen0, xgen.setNextName(xmlNames[i]); BeanPropertyWriter prop = props[i]; if (prop != null) { // can have nulls in filtered list + // [databind#6136]: let writer route filtering (any-getter + // filters per entry; view-based writers check view first) if ((cdata != null) && cdata.get(i)) { xgen.setNextIsCData(true); - filter.serializeAsProperty(bean, xgen, ctxt, prop); + prop.serializeFilteredAsProperty(bean, xgen, ctxt, filter); xgen.setNextIsCData(false); } else { - filter.serializeAsProperty(bean, xgen, ctxt, prop); + prop.serializeFilteredAsProperty(bean, xgen, ctxt, filter); } } // Reset to avoid next value being written as unwrapped, diff --git a/src/test/java/tools/jackson/dataformat/xml/ser/SerializationWithFilterTest.java b/src/test/java/tools/jackson/dataformat/xml/ser/SerializationWithFilterTest.java index 85ee0e00..a520859e 100644 --- a/src/test/java/tools/jackson/dataformat/xml/ser/SerializationWithFilterTest.java +++ b/src/test/java/tools/jackson/dataformat/xml/ser/SerializationWithFilterTest.java @@ -1,7 +1,11 @@ package tools.jackson.dataformat.xml.ser; +import java.util.LinkedHashMap; +import java.util.Map; + import org.junit.jupiter.api.Test; +import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonFilter; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @@ -32,6 +36,21 @@ static class Item public int c; } + // [databind#6136]: any-getter entries must be filtered per entry + @JsonFilter("filter") + static class AnyBean + { + public String name = "bob"; + + @JsonAnyGetter + public Map anyProperties() { + Map m = new LinkedHashMap<>(); + m.put("a", "1"); + m.put("secret", "s3cr3t"); + return m; + } + } + @Test public void testPullRequest616() throws Exception { @@ -62,4 +81,28 @@ public void serializeAsProperty(Object pojo, JsonGenerator g, .build(); assertEquals(exp, xmlMapper.writeValueAsString(bean)); } + + // [databind#6136] + @Test + public void anyGetterWithExcludingFilter() throws Exception + { + XmlMapper xmlMapper = XmlMapper.builder() + .filterProvider(new SimpleFilterProvider().addFilter("filter", + SimpleBeanPropertyFilter.serializeAllExcept("secret"))) + .build(); + assertEquals("bob1", + xmlMapper.writeValueAsString(new AnyBean())); + } + + // [databind#6136] + @Test + public void anyGetterWithIncludingFilter() throws Exception + { + XmlMapper xmlMapper = XmlMapper.builder() + .filterProvider(new SimpleFilterProvider().addFilter("filter", + SimpleBeanPropertyFilter.filterOutAllExcept("name", "a"))) + .build(); + assertEquals("bob1", + xmlMapper.writeValueAsString(new AnyBean())); + } }