Skip to content

Commit 5b78983

Browse files
authored
Fix #678: allow configuring custom SerializerFactory via JacksonXmlModule (#680)
1 parent 180a75b commit 5b78983

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

release-notes/VERSION-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ Project: jackson-dataformat-xml
44
=== Releases ===
55
------------------------------------------------------------------------
66

7+
2.18.2 (not yet released)
8+
9+
#678: XML module not registered correctly when setting a custom `SerializerFactory`
10+
(reported by @SimonCockx)
11+
712
2.18.1 (28-Oct-2024)
813

914
No changes since 2.18.0

src/main/java/com/fasterxml/jackson/dataformat/xml/JacksonXmlModule.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.fasterxml.jackson.databind.AnnotationIntrospector;
44
import com.fasterxml.jackson.databind.module.SimpleModule;
5-
5+
import com.fasterxml.jackson.databind.ser.SerializerFactory;
66
import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser;
77
import com.fasterxml.jackson.dataformat.xml.deser.XmlBeanDeserializerModifier;
88
import com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializerModifier;
@@ -39,13 +39,22 @@ public class JacksonXmlModule
3939
/**
4040
* Name used for pseudo-property used for returning XML Text value (which does
4141
* not have actual element name to use). Defaults to empty String, but
42-
* may be changed for interoperability reasons: JAXB, for example, uses
42+
* may be changed for inter-operability reasons: JAXB, for example, uses
4343
* "value" as name.
4444
*
4545
* @since 2.1
4646
*/
4747
protected String _cfgNameForTextElement = FromXmlParser.DEFAULT_UNNAMED_TEXT_PROPERTY;
48-
48+
49+
/**
50+
* Optional override for {@link SerializerFactory}
51+
* used by {@link XmlMapper}. Needed to allow proper override and configurability
52+
* using custom {@SerializerFactory} implementations.
53+
*
54+
* @since 2.18.2
55+
*/
56+
protected SerializerFactory _serializerFactoryOverride;
57+
4958
/*
5059
/**********************************************************************
5160
/* Life-cycle: construction
@@ -119,6 +128,29 @@ public void setDefaultUseWrapper(boolean state) {
119128
public void setXMLTextElementName(String name) {
120129
_cfgNameForTextElement = name;
121130
}
131+
132+
/**
133+
* Method to use for overriding default {@link SerializerFactory} used
134+
*
135+
* @since 2.18.2
136+
*/
137+
public JacksonXmlModule overrideSerializerFactory(SerializerFactory factory) {
138+
_serializerFactoryOverride = factory;
139+
return this;
140+
}
141+
142+
/*
143+
/**********************************************************************
144+
/* Accessors
145+
/**********************************************************************
146+
*/
147+
148+
/**
149+
* @since 2.18.2
150+
*/
151+
public SerializerFactory serializerFactoryOverride() {
152+
return _serializerFactoryOverride;
153+
}
122154

123155
/*
124156
/**********************************************************************

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory;
1717
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
1818
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
19+
import com.fasterxml.jackson.databind.ser.SerializerFactory;
1920
import com.fasterxml.jackson.databind.type.LogicalType;
2021
import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser;
2122
import com.fasterxml.jackson.dataformat.xml.deser.XmlDeserializationContext;
@@ -166,6 +167,11 @@ public XmlMapper(XmlFactory xmlFactory, JacksonXmlModule module)
166167
_xmlModule = module;
167168
// but all the rest is done via Module interface!
168169
if (module != null) {
170+
// [dataformat-xml#678]: need special handling for SerializerFactory override
171+
SerializerFactory sfOverride = module.serializerFactoryOverride();
172+
if (sfOverride != null) {
173+
setSerializerFactory(sfOverride);
174+
}
169175
registerModule(module);
170176
}
171177
// 19-May-2015, tatu: Must ensure we use XML-specific indenter

0 commit comments

Comments
 (0)