Fix Jackson builder modulesToInstall override behavior

This commit updates Jackson2ObjectMapperBuilder in order
to ensure that modules specified via modulesToInstall
eventually override the default ones.

Closes gh-22576
This commit is contained in:
Sebastien Deleuze
2019-03-19 16:58:14 +01:00
parent 5f111098b1
commit 35010149f8
3 changed files with 78 additions and 16 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -632,21 +632,24 @@ public class Jackson2ObjectMapperBuilder {
public void configure(ObjectMapper objectMapper) {
Assert.notNull(objectMapper, "ObjectMapper must not be null");
Map<Object, Module> modulesToRegister = new LinkedHashMap<>();
if (this.findModulesViaServiceLoader) {
objectMapper.registerModules(ObjectMapper.findModules(this.moduleClassLoader));
ObjectMapper.findModules(this.moduleClassLoader).forEach(module -> modulesToRegister.put(module.getTypeId(), module));
}
else if (this.findWellKnownModules) {
registerWellKnownModulesIfAvailable(objectMapper);
registerWellKnownModulesIfAvailable(modulesToRegister);
}
if (this.modules != null) {
objectMapper.registerModules(this.modules);
this.modules.forEach(module -> modulesToRegister.put(module.getTypeId(), module));
}
if (this.moduleClasses != null) {
for (Class<? extends Module> module : this.moduleClasses) {
objectMapper.registerModule(BeanUtils.instantiateClass(module));
for (Class<? extends Module> moduleClass : this.moduleClasses) {
Module module = BeanUtils.instantiateClass(moduleClass);
modulesToRegister.put(module.getTypeId(), module);
}
}
objectMapper.registerModules(modulesToRegister.values());
if (this.dateFormat != null) {
objectMapper.setDateFormat(this.dateFormat);
@@ -744,20 +747,22 @@ public class Jackson2ObjectMapperBuilder {
}
@SuppressWarnings("unchecked")
private void registerWellKnownModulesIfAvailable(ObjectMapper objectMapper) {
private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRegister) {
try {
Class<? extends Module> jdk8Module = (Class<? extends Module>)
Class<? extends Module> jdk8ModuleClass = (Class<? extends Module>)
ClassUtils.forName("com.fasterxml.jackson.datatype.jdk8.Jdk8Module", this.moduleClassLoader);
objectMapper.registerModule(BeanUtils.instantiateClass(jdk8Module));
Module jdk8Module = BeanUtils.instantiateClass(jdk8ModuleClass);
modulesToRegister.put(jdk8Module.getTypeId(), jdk8Module);
}
catch (ClassNotFoundException ex) {
// jackson-datatype-jdk8 not available
}
try {
Class<? extends Module> javaTimeModule = (Class<? extends Module>)
Class<? extends Module> javaTimeModuleClass = (Class<? extends Module>)
ClassUtils.forName("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule", this.moduleClassLoader);
objectMapper.registerModule(BeanUtils.instantiateClass(javaTimeModule));
Module javaTimeModule = BeanUtils.instantiateClass(javaTimeModuleClass);
modulesToRegister.put(javaTimeModule.getTypeId(), javaTimeModule);
}
catch (ClassNotFoundException ex) {
// jackson-datatype-jsr310 not available
@@ -766,9 +771,10 @@ public class Jackson2ObjectMapperBuilder {
// Joda-Time present?
if (ClassUtils.isPresent("org.joda.time.LocalDate", this.moduleClassLoader)) {
try {
Class<? extends Module> jodaModule = (Class<? extends Module>)
Class<? extends Module> jodaModuleClass = (Class<? extends Module>)
ClassUtils.forName("com.fasterxml.jackson.datatype.joda.JodaModule", this.moduleClassLoader);
objectMapper.registerModule(BeanUtils.instantiateClass(jodaModule));
Module jodaModule = BeanUtils.instantiateClass(jodaModuleClass);
modulesToRegister.put(jodaModule.getTypeId(), jodaModule);
}
catch (ClassNotFoundException ex) {
// jackson-datatype-joda not available
@@ -778,9 +784,10 @@ public class Jackson2ObjectMapperBuilder {
// Kotlin present?
if (KotlinDetector.isKotlinPresent()) {
try {
Class<? extends Module> kotlinModule = (Class<? extends Module>)
Class<? extends Module> kotlinModuleClass = (Class<? extends Module>)
ClassUtils.forName("com.fasterxml.jackson.module.kotlin.KotlinModule", this.moduleClassLoader);
objectMapper.registerModule(BeanUtils.instantiateClass(kotlinModule));
Module kotlinModule = BeanUtils.instantiateClass(kotlinModuleClass);
modulesToRegister.put(kotlinModule.getTypeId(), kotlinModule);
}
catch (ClassNotFoundException ex) {
if (!kotlinWarningLogged) {