diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java index 81b00faf613..dbbfefbe828 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java @@ -614,8 +614,8 @@ public class Jackson2ObjectMapperBuilder { ObjectMapper mapper; if (this.createXmlMapper) { mapper = (this.defaultUseWrapper != null ? - new XmlObjectMapperInitializer().create(this.defaultUseWrapper) : - new XmlObjectMapperInitializer().create()); + new XmlObjectMapperInitializer().create(this.defaultUseWrapper, this.factory) : + new XmlObjectMapperInitializer().create(this.factory)); } else { mapper = (this.factory != null ? new ObjectMapper(this.factory) : new ObjectMapper()); @@ -839,14 +839,24 @@ public class Jackson2ObjectMapperBuilder { private static class XmlObjectMapperInitializer { - public ObjectMapper create() { - return new XmlMapper(StaxUtils.createDefensiveInputFactory()); + public ObjectMapper create(@Nullable JsonFactory factory) { + if (factory != null) { + return new XmlMapper((XmlFactory) factory); + } + else { + return new XmlMapper(StaxUtils.createDefensiveInputFactory()); + } } - public ObjectMapper create(boolean defaultUseWrapper) { + public ObjectMapper create(boolean defaultUseWrapper, @Nullable JsonFactory factory) { JacksonXmlModule module = new JacksonXmlModule(); module.setDefaultUseWrapper(defaultUseWrapper); - return new XmlMapper(new XmlFactory(StaxUtils.createDefensiveInputFactory()), module); + if (factory != null) { + return new XmlMapper((XmlFactory) factory, module); + } + else { + return new XmlMapper(new XmlFactory(StaxUtils.createDefensiveInputFactory()), module); + } } } diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java index 8997ffbe2b8..ec38333a600 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java @@ -71,6 +71,7 @@ import com.fasterxml.jackson.databind.ser.std.NumberSerializer; import com.fasterxml.jackson.databind.type.SimpleType; import com.fasterxml.jackson.dataformat.cbor.CBORFactory; import com.fasterxml.jackson.dataformat.smile.SmileFactory; +import com.fasterxml.jackson.dataformat.xml.XmlFactory; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import kotlin.ranges.IntRange; @@ -480,6 +481,14 @@ public class Jackson2ObjectMapperBuilderTests { assertEquals(XmlMapper.class, objectMapper.getClass()); } + @Test // gh-22428 + public void xmlMapperAndCustomFactory() { + ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().factory(new MyXmlFactory()).build(); + assertNotNull(objectMapper); + assertEquals(XmlMapper.class, objectMapper.getClass()); + assertEquals(MyXmlFactory.class, objectMapper.getFactory().getClass()); + } + @Test public void createXmlMapper() { Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json().indentOutput(true); @@ -667,4 +676,7 @@ public class Jackson2ObjectMapperBuilderTests { } + public static class MyXmlFactory extends XmlFactory { + } + }