56
56
import org .springframework .context .ApplicationContext ;
57
57
import org .springframework .util .Assert ;
58
58
import org .springframework .util .ClassUtils ;
59
+ import org .springframework .util .LinkedMultiValueMap ;
60
+ import org .springframework .util .MultiValueMap ;
59
61
import org .springframework .util .StreamUtils ;
60
62
import org .springframework .util .StringUtils ;
61
63
@@ -599,11 +601,10 @@ public <T extends ObjectMapper> T build() {
599
601
public void configure (ObjectMapper objectMapper ) {
600
602
Assert .notNull (objectMapper , "ObjectMapper must not be null" );
601
603
602
- Map <Object , Module > modulesToRegister = new LinkedHashMap <Object , Module >();
604
+ MultiValueMap <Object , Module > modulesToRegister = new LinkedMultiValueMap <Object , Module >();
603
605
if (this .findModulesViaServiceLoader ) {
604
- // Jackson 2.2+
605
606
for (Module module : ObjectMapper .findModules (this .moduleClassLoader )) {
606
- modulesToRegister . put (module . getTypeId (), module );
607
+ registerModule (module , modulesToRegister );
607
608
}
608
609
}
609
610
else if (this .findWellKnownModules ) {
@@ -612,18 +613,19 @@ else if (this.findWellKnownModules) {
612
613
613
614
if (this .modules != null ) {
614
615
for (Module module : this .modules ) {
615
- modulesToRegister . put (module . getTypeId (), module );
616
+ registerModule (module , modulesToRegister );
616
617
}
617
618
}
618
619
if (this .moduleClasses != null ) {
619
620
for (Class <? extends Module > moduleClass : this .moduleClasses ) {
620
- Module module = BeanUtils .instantiateClass (moduleClass );
621
- modulesToRegister .put (module .getTypeId (), module );
621
+ registerModule (BeanUtils .instantiateClass (moduleClass ), modulesToRegister );
622
622
}
623
623
}
624
624
// Using Jackson 2.0+ registerModule method, not Jackson 2.2+ registerModules
625
- for (Module module : modulesToRegister .values ()) {
626
- objectMapper .registerModule (module );
625
+ for (List <Module > nestedModules : modulesToRegister .values ()) {
626
+ for (Module module : nestedModules ) {
627
+ objectMapper .registerModule (module );
628
+ }
627
629
}
628
630
629
631
if (this .dateFormat != null ) {
@@ -678,6 +680,15 @@ else if (this.applicationContext != null) {
678
680
}
679
681
}
680
682
683
+ private void registerModule (Module module , MultiValueMap <Object , Module > modulesToRegister ) {
684
+ if (module .getTypeId () == null ) {
685
+ modulesToRegister .add (SimpleModule .class .getName (), module );
686
+ }
687
+ else {
688
+ modulesToRegister .set (module .getTypeId (), module );
689
+ }
690
+ }
691
+
681
692
682
693
// Any change to this method should be also applied to spring-jms and spring-messaging
683
694
// MappingJackson2MessageConverter default constructors
@@ -726,14 +737,14 @@ else if (feature instanceof MapperFeature) {
726
737
}
727
738
728
739
@ SuppressWarnings ("unchecked" )
729
- private void registerWellKnownModulesIfAvailable (Map <Object , Module > modulesToRegister ) {
740
+ private void registerWellKnownModulesIfAvailable (MultiValueMap <Object , Module > modulesToRegister ) {
730
741
// Java 7 java.nio.file.Path class present?
731
742
if (ClassUtils .isPresent ("java.nio.file.Path" , this .moduleClassLoader )) {
732
743
try {
733
744
Class <? extends Module > jdk7ModuleClass = (Class <? extends Module >)
734
745
ClassUtils .forName ("com.fasterxml.jackson.datatype.jdk7.Jdk7Module" , this .moduleClassLoader );
735
746
Module jdk7Module = BeanUtils .instantiateClass (jdk7ModuleClass );
736
- modulesToRegister .put (jdk7Module .getTypeId (), jdk7Module );
747
+ modulesToRegister .set (jdk7Module .getTypeId (), jdk7Module );
737
748
}
738
749
catch (ClassNotFoundException ex ) {
739
750
// jackson-datatype-jdk7 not available
@@ -746,7 +757,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
746
757
Class <? extends Module > jdk8ModuleClass = (Class <? extends Module >)
747
758
ClassUtils .forName ("com.fasterxml.jackson.datatype.jdk8.Jdk8Module" , this .moduleClassLoader );
748
759
Module jdk8Module = BeanUtils .instantiateClass (jdk8ModuleClass );
749
- modulesToRegister .put (jdk8Module .getTypeId (), jdk8Module );
760
+ modulesToRegister .set (jdk8Module .getTypeId (), jdk8Module );
750
761
}
751
762
catch (ClassNotFoundException ex ) {
752
763
// jackson-datatype-jdk8 not available
@@ -759,7 +770,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
759
770
Class <? extends Module > javaTimeModuleClass = (Class <? extends Module >)
760
771
ClassUtils .forName ("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule" , this .moduleClassLoader );
761
772
Module javaTimeModule = BeanUtils .instantiateClass (javaTimeModuleClass );
762
- modulesToRegister .put (javaTimeModule .getTypeId (), javaTimeModule );
773
+ modulesToRegister .set (javaTimeModule .getTypeId (), javaTimeModule );
763
774
}
764
775
catch (ClassNotFoundException ex ) {
765
776
// jackson-datatype-jsr310 not available
@@ -772,7 +783,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
772
783
Class <? extends Module > jodaModuleClass = (Class <? extends Module >)
773
784
ClassUtils .forName ("com.fasterxml.jackson.datatype.joda.JodaModule" , this .moduleClassLoader );
774
785
Module jodaModule = BeanUtils .instantiateClass (jodaModuleClass );
775
- modulesToRegister .put (jodaModule .getTypeId (), jodaModule );
786
+ modulesToRegister .set (jodaModule .getTypeId (), jodaModule );
776
787
}
777
788
catch (ClassNotFoundException ex ) {
778
789
// jackson-datatype-joda not available
@@ -785,7 +796,7 @@ private void registerWellKnownModulesIfAvailable(Map<Object, Module> modulesToRe
785
796
Class <? extends Module > kotlinModuleClass = (Class <? extends Module >)
786
797
ClassUtils .forName ("com.fasterxml.jackson.module.kotlin.KotlinModule" , this .moduleClassLoader );
787
798
Module kotlinModule = BeanUtils .instantiateClass (kotlinModuleClass );
788
- modulesToRegister .put (kotlinModule .getTypeId (), kotlinModule );
799
+ modulesToRegister .set (kotlinModule .getTypeId (), kotlinModule );
789
800
}
790
801
catch (ClassNotFoundException ex ) {
791
802
// jackson-module-kotlin not available
0 commit comments