18
18
19
19
import java .text .DateFormat ;
20
20
import java .text .SimpleDateFormat ;
21
+ import java .util .ArrayList ;
21
22
import java .util .Arrays ;
22
23
import java .util .HashMap ;
23
24
import java .util .LinkedHashMap ;
61
62
import org .springframework .lang .Nullable ;
62
63
import org .springframework .util .Assert ;
63
64
import org .springframework .util .ClassUtils ;
65
+ import org .springframework .util .LinkedMultiValueMap ;
66
+ import org .springframework .util .MultiValueMap ;
64
67
import org .springframework .util .StringUtils ;
65
68
import org .springframework .util .xml .StaxUtils ;
66
69
@@ -617,24 +620,27 @@ public <T extends ObjectMapper> T build() {
617
620
public void configure (ObjectMapper objectMapper ) {
618
621
Assert .notNull (objectMapper , "ObjectMapper must not be null" );
619
622
620
- Map <Object , Module > modulesToRegister = new LinkedHashMap <>();
623
+ MultiValueMap <Object , Module > modulesToRegister = new LinkedMultiValueMap <>();
621
624
if (this .findModulesViaServiceLoader ) {
622
- ObjectMapper .findModules (this .moduleClassLoader ).forEach (module -> modulesToRegister . put (module . getTypeId (), module ));
625
+ ObjectMapper .findModules (this .moduleClassLoader ).forEach (module -> registerModule (module , modulesToRegister ));
623
626
}
624
627
else if (this .findWellKnownModules ) {
625
628
registerWellKnownModulesIfAvailable (modulesToRegister );
626
629
}
627
630
628
631
if (this .modules != null ) {
629
- this .modules .forEach (module -> modulesToRegister . put (module . getTypeId (), module ));
632
+ this .modules .forEach (module -> registerModule (module , modulesToRegister ));
630
633
}
631
634
if (this .moduleClasses != null ) {
632
635
for (Class <? extends Module > moduleClass : this .moduleClasses ) {
633
- Module module = BeanUtils .instantiateClass (moduleClass );
634
- modulesToRegister .put (module .getTypeId (), module );
636
+ registerModule (BeanUtils .instantiateClass (moduleClass ), modulesToRegister );
635
637
}
636
638
}
637
- objectMapper .registerModules (modulesToRegister .values ());
639
+ List <Module > modules = new ArrayList <>();
640
+ for (List <Module > nestedModules : modulesToRegister .values ()) {
641
+ modules .addAll (nestedModules );
642
+ }
643
+ objectMapper .registerModules (modules );
638
644
639
645
if (this .dateFormat != null ) {
640
646
objectMapper .setDateFormat (this .dateFormat );
@@ -684,6 +690,15 @@ else if (this.applicationContext != null) {
684
690
}
685
691
}
686
692
693
+ private void registerModule (Module module , MultiValueMap <Object , Module > modulesToRegister ) {
694
+ if (module .getTypeId () == null ) {
695
+ modulesToRegister .add (SimpleModule .class .getName (), module );
696
+ }
697
+ else {
698
+ modulesToRegister .set (module .getTypeId (), module );
699
+ }
700
+ }
701
+
687
702
688
703
// Any change to this method should be also applied to spring-jms and spring-messaging
689
704
// MappingJackson2MessageConverter default constructors
@@ -730,12 +745,12 @@ else if (feature instanceof MapperFeature) {
730
745
}
731
746
732
747
@ SuppressWarnings ("unchecked" )
733
- private void registerWellKnownModulesIfAvailable (Map <Object , Module > modulesToRegister ) {
748
+ private void registerWellKnownModulesIfAvailable (MultiValueMap <Object , Module > modulesToRegister ) {
734
749
try {
735
750
Class <? extends Module > jdk8ModuleClass = (Class <? extends Module >)
736
751
ClassUtils .forName ("com.fasterxml.jackson.datatype.jdk8.Jdk8Module" , this .moduleClassLoader );
737
752
Module jdk8Module = BeanUtils .instantiateClass (jdk8ModuleClass );
738
- modulesToRegister .put (jdk8Module .getTypeId (), jdk8Module );
753
+ modulesToRegister .set (jdk8Module .getTypeId (), jdk8Module );
739
754
}
740
755
catch (ClassNotFoundException ex ) {
741
756
// jackson-datatype-jdk8 not available
@@ -745,7 +760,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
745
760
Class <? extends Module > javaTimeModuleClass = (Class <? extends Module >)
746
761
ClassUtils .forName ("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule" , this .moduleClassLoader );
747
762
Module javaTimeModule = BeanUtils .instantiateClass (javaTimeModuleClass );
748
- modulesToRegister .put (javaTimeModule .getTypeId (), javaTimeModule );
763
+ modulesToRegister .set (javaTimeModule .getTypeId (), javaTimeModule );
749
764
}
750
765
catch (ClassNotFoundException ex ) {
751
766
// jackson-datatype-jsr310 not available
@@ -757,7 +772,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
757
772
Class <? extends Module > jodaModuleClass = (Class <? extends Module >)
758
773
ClassUtils .forName ("com.fasterxml.jackson.datatype.joda.JodaModule" , this .moduleClassLoader );
759
774
Module jodaModule = BeanUtils .instantiateClass (jodaModuleClass );
760
- modulesToRegister .put (jodaModule .getTypeId (), jodaModule );
775
+ modulesToRegister .set (jodaModule .getTypeId (), jodaModule );
761
776
}
762
777
catch (ClassNotFoundException ex ) {
763
778
// jackson-datatype-joda not available
@@ -770,7 +785,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
770
785
Class <? extends Module > kotlinModuleClass = (Class <? extends Module >)
771
786
ClassUtils .forName ("com.fasterxml.jackson.module.kotlin.KotlinModule" , this .moduleClassLoader );
772
787
Module kotlinModule = BeanUtils .instantiateClass (kotlinModuleClass );
773
- modulesToRegister .put (kotlinModule .getTypeId (), kotlinModule );
788
+ modulesToRegister .set (kotlinModule .getTypeId (), kotlinModule );
774
789
}
775
790
catch (ClassNotFoundException ex ) {
776
791
if (!kotlinWarningLogged ) {
0 commit comments