diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 8398db4e..f8260a41 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -4,6 +4,11 @@ Project: jackson-dataformat-xml === Releases === ------------------------------------------------------------------------ +2.18.2 (not yet released) + +#678: XML module not registered correctly when setting a custom `SerializerFactory` + (reported by @SimonCockx) + 2.18.1 (28-Oct-2024) No changes since 2.18.0 diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/JacksonXmlModule.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/JacksonXmlModule.java index c9a57c1d..0c7d8579 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/JacksonXmlModule.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/JacksonXmlModule.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.AnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; - +import com.fasterxml.jackson.databind.ser.SerializerFactory; import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser; import com.fasterxml.jackson.dataformat.xml.deser.XmlBeanDeserializerModifier; import com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializerModifier; @@ -39,13 +39,22 @@ public class JacksonXmlModule /** * Name used for pseudo-property used for returning XML Text value (which does * not have actual element name to use). Defaults to empty String, but - * may be changed for interoperability reasons: JAXB, for example, uses + * may be changed for inter-operability reasons: JAXB, for example, uses * "value" as name. * * @since 2.1 */ protected String _cfgNameForTextElement = FromXmlParser.DEFAULT_UNNAMED_TEXT_PROPERTY; - + + /** + * Optional override for {@link SerializerFactory} + * used by {@link XmlMapper}. Needed to allow proper override and configurability + * using custom {@SerializerFactory} implementations. + * + * @since 2.18.2 + */ + protected SerializerFactory _serializerFactoryOverride; + /* /********************************************************************** /* Life-cycle: construction @@ -119,6 +128,29 @@ public void setDefaultUseWrapper(boolean state) { public void setXMLTextElementName(String name) { _cfgNameForTextElement = name; } + + /** + * Method to use for overriding default {@link SerializerFactory} used + * + * @since 2.18.2 + */ + public JacksonXmlModule overrideSerializerFactory(SerializerFactory factory) { + _serializerFactoryOverride = factory; + return this; + } + + /* + /********************************************************************** + /* Accessors + /********************************************************************** + */ + + /** + * @since 2.18.2 + */ + public SerializerFactory serializerFactoryOverride() { + return _serializerFactoryOverride; + } /* /********************************************************************** diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java index 0fc5c1e9..a7469e5a 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.deser.BeanDeserializerFactory; import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator; import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; +import com.fasterxml.jackson.databind.ser.SerializerFactory; import com.fasterxml.jackson.databind.type.LogicalType; import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser; import com.fasterxml.jackson.dataformat.xml.deser.XmlDeserializationContext; @@ -166,6 +167,11 @@ public XmlMapper(XmlFactory xmlFactory, JacksonXmlModule module) _xmlModule = module; // but all the rest is done via Module interface! if (module != null) { + // [dataformat-xml#678]: need special handling for SerializerFactory override + SerializerFactory sfOverride = module.serializerFactoryOverride(); + if (sfOverride != null) { + setSerializerFactory(sfOverride); + } registerModule(module); } // 19-May-2015, tatu: Must ensure we use XML-specific indenter