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 .LinkedHashMap ;
23
24
import java .util .LinkedList ;
62
63
import org .springframework .lang .Nullable ;
63
64
import org .springframework .util .Assert ;
64
65
import org .springframework .util .ClassUtils ;
66
+ import org .springframework .util .LinkedMultiValueMap ;
67
+ import org .springframework .util .MultiValueMap ;
65
68
import org .springframework .util .StringUtils ;
66
69
import org .springframework .util .xml .StaxUtils ;
67
70
@@ -632,24 +635,27 @@ public <T extends ObjectMapper> T build() {
632
635
public void configure (ObjectMapper objectMapper ) {
633
636
Assert .notNull (objectMapper , "ObjectMapper must not be null" );
634
637
635
- Map <Object , Module > modulesToRegister = new LinkedHashMap <>();
638
+ MultiValueMap <Object , Module > modulesToRegister = new LinkedMultiValueMap <>();
636
639
if (this .findModulesViaServiceLoader ) {
637
- ObjectMapper .findModules (this .moduleClassLoader ).forEach (module -> modulesToRegister . put (module . getTypeId (), module ));
640
+ ObjectMapper .findModules (this .moduleClassLoader ).forEach (module -> registerModule (module , modulesToRegister ));
638
641
}
639
642
else if (this .findWellKnownModules ) {
640
643
registerWellKnownModulesIfAvailable (modulesToRegister );
641
644
}
642
645
643
646
if (this .modules != null ) {
644
- this .modules .forEach (module -> modulesToRegister . put (module . getTypeId (), module ));
647
+ this .modules .forEach (module -> registerModule (module , modulesToRegister ));
645
648
}
646
649
if (this .moduleClasses != null ) {
647
650
for (Class <? extends Module > moduleClass : this .moduleClasses ) {
648
- Module module = BeanUtils .instantiateClass (moduleClass );
649
- modulesToRegister .put (module .getTypeId (), module );
651
+ registerModule (BeanUtils .instantiateClass (moduleClass ), modulesToRegister );
650
652
}
651
653
}
652
- objectMapper .registerModules (modulesToRegister .values ());
654
+ List <Module > modules = new ArrayList <>();
655
+ for (List <Module > nestedModules : modulesToRegister .values ()) {
656
+ modules .addAll (nestedModules );
657
+ }
658
+ objectMapper .registerModules (modules );
653
659
654
660
if (this .dateFormat != null ) {
655
661
objectMapper .setDateFormat (this .dateFormat );
@@ -701,6 +707,15 @@ else if (this.applicationContext != null) {
701
707
}
702
708
}
703
709
710
+ private void registerModule (Module module , MultiValueMap <Object , Module > modulesToRegister ) {
711
+ if (module .getTypeId () == null ) {
712
+ modulesToRegister .add (SimpleModule .class .getName (), module );
713
+ }
714
+ else {
715
+ modulesToRegister .set (module .getTypeId (), module );
716
+ }
717
+ }
718
+
704
719
705
720
// Any change to this method should be also applied to spring-jms and spring-messaging
706
721
// MappingJackson2MessageConverter default constructors
@@ -747,12 +762,12 @@ else if (feature instanceof MapperFeature) {
747
762
}
748
763
749
764
@ SuppressWarnings ("unchecked" )
750
- private void registerWellKnownModulesIfAvailable (Map <Object , Module > modulesToRegister ) {
765
+ private void registerWellKnownModulesIfAvailable (MultiValueMap <Object , Module > modulesToRegister ) {
751
766
try {
752
767
Class <? extends Module > jdk8ModuleClass = (Class <? extends Module >)
753
768
ClassUtils .forName ("com.fasterxml.jackson.datatype.jdk8.Jdk8Module" , this .moduleClassLoader );
754
769
Module jdk8Module = BeanUtils .instantiateClass (jdk8ModuleClass );
755
- modulesToRegister .put (jdk8Module .getTypeId (), jdk8Module );
770
+ modulesToRegister .set (jdk8Module .getTypeId (), jdk8Module );
756
771
}
757
772
catch (ClassNotFoundException ex ) {
758
773
// jackson-datatype-jdk8 not available
@@ -762,7 +777,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
762
777
Class <? extends Module > javaTimeModuleClass = (Class <? extends Module >)
763
778
ClassUtils .forName ("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule" , this .moduleClassLoader );
764
779
Module javaTimeModule = BeanUtils .instantiateClass (javaTimeModuleClass );
765
- modulesToRegister .put (javaTimeModule .getTypeId (), javaTimeModule );
780
+ modulesToRegister .set (javaTimeModule .getTypeId (), javaTimeModule );
766
781
}
767
782
catch (ClassNotFoundException ex ) {
768
783
// jackson-datatype-jsr310 not available
@@ -774,7 +789,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
774
789
Class <? extends Module > jodaModuleClass = (Class <? extends Module >)
775
790
ClassUtils .forName ("com.fasterxml.jackson.datatype.joda.JodaModule" , this .moduleClassLoader );
776
791
Module jodaModule = BeanUtils .instantiateClass (jodaModuleClass );
777
- modulesToRegister .put (jodaModule .getTypeId (), jodaModule );
792
+ modulesToRegister .set (jodaModule .getTypeId (), jodaModule );
778
793
}
779
794
catch (ClassNotFoundException ex ) {
780
795
// jackson-datatype-joda not available
@@ -787,7 +802,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
787
802
Class <? extends Module > kotlinModuleClass = (Class <? extends Module >)
788
803
ClassUtils .forName ("com.fasterxml.jackson.module.kotlin.KotlinModule" , this .moduleClassLoader );
789
804
Module kotlinModule = BeanUtils .instantiateClass (kotlinModuleClass );
790
- modulesToRegister .put (kotlinModule .getTypeId (), kotlinModule );
805
+ modulesToRegister .set (kotlinModule .getTypeId (), kotlinModule );
791
806
}
792
807
catch (ClassNotFoundException ex ) {
793
808
if (!kotlinWarningLogged ) {
0 commit comments