Skip to content

Commit f0ae8bc

Browse files
committed
Support custom XmlFactory in Jackson2ObjectMapperBuilder
Closes gh-22428
1 parent ca24fd5 commit f0ae8bc

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -614,8 +614,8 @@ public <T extends ObjectMapper> T build() {
614614
ObjectMapper mapper;
615615
if (this.createXmlMapper) {
616616
mapper = (this.defaultUseWrapper != null ?
617-
new XmlObjectMapperInitializer().create(this.defaultUseWrapper) :
618-
new XmlObjectMapperInitializer().create());
617+
new XmlObjectMapperInitializer().create(this.defaultUseWrapper, this.factory) :
618+
new XmlObjectMapperInitializer().create(this.factory));
619619
}
620620
else {
621621
mapper = (this.factory != null ? new ObjectMapper(this.factory) : new ObjectMapper());
@@ -839,14 +839,24 @@ public static Jackson2ObjectMapperBuilder cbor() {
839839

840840
private static class XmlObjectMapperInitializer {
841841

842-
public ObjectMapper create() {
843-
return new XmlMapper(StaxUtils.createDefensiveInputFactory());
842+
public ObjectMapper create(@Nullable JsonFactory factory) {
843+
if (factory != null) {
844+
return new XmlMapper((XmlFactory) factory);
845+
}
846+
else {
847+
return new XmlMapper(StaxUtils.createDefensiveInputFactory());
848+
}
844849
}
845850

846-
public ObjectMapper create(boolean defaultUseWrapper) {
851+
public ObjectMapper create(boolean defaultUseWrapper, @Nullable JsonFactory factory) {
847852
JacksonXmlModule module = new JacksonXmlModule();
848853
module.setDefaultUseWrapper(defaultUseWrapper);
849-
return new XmlMapper(new XmlFactory(StaxUtils.createDefensiveInputFactory()), module);
854+
if (factory != null) {
855+
return new XmlMapper((XmlFactory) factory, module);
856+
}
857+
else {
858+
return new XmlMapper(new XmlFactory(StaxUtils.createDefensiveInputFactory()), module);
859+
}
850860
}
851861
}
852862

spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import com.fasterxml.jackson.databind.type.SimpleType;
7272
import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
7373
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
74+
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
7475
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
7576
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
7677
import kotlin.ranges.IntRange;
@@ -480,6 +481,14 @@ public void xmlMapper() {
480481
assertEquals(XmlMapper.class, objectMapper.getClass());
481482
}
482483

484+
@Test // gh-22428
485+
public void xmlMapperAndCustomFactory() {
486+
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().factory(new MyXmlFactory()).build();
487+
assertNotNull(objectMapper);
488+
assertEquals(XmlMapper.class, objectMapper.getClass());
489+
assertEquals(MyXmlFactory.class, objectMapper.getFactory().getClass());
490+
}
491+
483492
@Test
484493
public void createXmlMapper() {
485494
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json().indentOutput(true);
@@ -667,4 +676,7 @@ public void setOffsetDateTime(OffsetDateTime offsetDateTime) {
667676

668677
}
669678

679+
public static class MyXmlFactory extends XmlFactory {
680+
}
681+
670682
}

0 commit comments

Comments
 (0)