1
1
/*
2
- * Copyright 2002-2024 the original author or authors.
2
+ * Copyright 2002-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
47
47
import org .springframework .http .converter .ResourceHttpMessageConverter ;
48
48
import org .springframework .http .converter .ResourceRegionHttpMessageConverter ;
49
49
import org .springframework .http .converter .StringHttpMessageConverter ;
50
+ import org .springframework .http .converter .cbor .JacksonCborHttpMessageConverter ;
50
51
import org .springframework .http .converter .cbor .MappingJackson2CborHttpMessageConverter ;
51
52
import org .springframework .http .converter .feed .AtomFeedHttpMessageConverter ;
52
53
import org .springframework .http .converter .feed .RssChannelHttpMessageConverter ;
53
54
import org .springframework .http .converter .json .GsonHttpMessageConverter ;
54
55
import org .springframework .http .converter .json .Jackson2ObjectMapperFactoryBean ;
56
+ import org .springframework .http .converter .json .JacksonJsonHttpMessageConverter ;
55
57
import org .springframework .http .converter .json .MappingJackson2HttpMessageConverter ;
58
+ import org .springframework .http .converter .smile .JacksonSmileHttpMessageConverter ;
56
59
import org .springframework .http .converter .smile .MappingJackson2SmileHttpMessageConverter ;
57
60
import org .springframework .http .converter .support .AllEncompassingFormHttpMessageConverter ;
61
+ import org .springframework .http .converter .xml .JacksonXmlHttpMessageConverter ;
58
62
import org .springframework .http .converter .xml .Jaxb2RootElementHttpMessageConverter ;
59
63
import org .springframework .http .converter .xml .MappingJackson2XmlHttpMessageConverter ;
64
+ import org .springframework .http .converter .yaml .JacksonYamlHttpMessageConverter ;
60
65
import org .springframework .http .converter .yaml .MappingJackson2YamlHttpMessageConverter ;
61
66
import org .springframework .util .Assert ;
62
67
import org .springframework .util .ClassUtils ;
151
156
* @author Brian Clozel
152
157
* @author Agim Emruli
153
158
* @author Hyoungjune Kim
159
+ * @author Sebastien Deleuze
154
160
* @since 3.0
155
161
*/
156
162
class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
@@ -168,14 +174,24 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
168
174
169
175
private static final boolean jaxb2Present ;
170
176
177
+ private static final boolean jacksonPresent ;
178
+
171
179
private static final boolean jackson2Present ;
172
180
181
+ private static final boolean jacksonXmlPresent ;
182
+
173
183
private static final boolean jackson2XmlPresent ;
174
184
185
+ private static final boolean jacksonSmilePresent ;
186
+
175
187
private static final boolean jackson2SmilePresent ;
176
188
189
+ private static final boolean jacksonCborPresent ;
190
+
177
191
private static final boolean jackson2CborPresent ;
178
192
193
+ private static final boolean jacksonYamlPresent ;
194
+
179
195
private static final boolean jackson2YamlPresent ;
180
196
181
197
private static final boolean gsonPresent ;
@@ -185,12 +201,17 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
185
201
javaxValidationPresent = ClassUtils .isPresent ("jakarta.validation.Validator" , classLoader );
186
202
romePresent = ClassUtils .isPresent ("com.rometools.rome.feed.WireFeed" , classLoader );
187
203
jaxb2Present = ClassUtils .isPresent ("jakarta.xml.bind.Binder" , classLoader );
204
+ jacksonPresent = ClassUtils .isPresent ("tools.jackson.databind.ObjectMapper" , classLoader );
188
205
jackson2Present = ClassUtils .isPresent ("com.fasterxml.jackson.databind.ObjectMapper" , classLoader ) &&
189
206
ClassUtils .isPresent ("com.fasterxml.jackson.core.JsonGenerator" , classLoader );
190
- jackson2XmlPresent = ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.xml.XmlMapper" , classLoader );
191
- jackson2SmilePresent = ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.smile.SmileFactory" , classLoader );
192
- jackson2CborPresent = ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.cbor.CBORFactory" , classLoader );
193
- jackson2YamlPresent = ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.yaml.YAMLFactory" , classLoader );
207
+ jacksonXmlPresent = jacksonPresent && ClassUtils .isPresent ("tools.jackson.dataformat.xml.XmlMapper" , classLoader );
208
+ jackson2XmlPresent = jackson2Present && ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.xml.XmlMapper" , classLoader );
209
+ jacksonSmilePresent = jacksonPresent && ClassUtils .isPresent ("tools.jackson.dataformat.smile.SmileMapper" , classLoader );
210
+ jackson2SmilePresent = jackson2Present && ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.smile.SmileFactory" , classLoader );
211
+ jacksonCborPresent = jacksonPresent && ClassUtils .isPresent ("tools.jackson.dataformat.cbor.CBORMapper" , classLoader );
212
+ jackson2CborPresent = jackson2Present && ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.cbor.CBORFactory" , classLoader );
213
+ jacksonYamlPresent = jacksonPresent && ClassUtils .isPresent ("tools.jackson.dataformat.yaml.YAMLMapper" , classLoader );
214
+ jackson2YamlPresent = jackson2Present && ClassUtils .isPresent ("com.fasterxml.jackson.dataformat.yaml.YAMLFactory" , classLoader );
194
215
gsonPresent = ClassUtils .isPresent ("com.google.gson.Gson" , classLoader );
195
216
}
196
217
@@ -446,19 +467,19 @@ private Properties getDefaultMediaTypes() {
446
467
defaultMediaTypes .put ("atom" , MediaType .APPLICATION_ATOM_XML_VALUE );
447
468
defaultMediaTypes .put ("rss" , MediaType .APPLICATION_RSS_XML_VALUE );
448
469
}
449
- if (jaxb2Present || jackson2XmlPresent ) {
470
+ if (jaxb2Present || jacksonXmlPresent || jackson2XmlPresent ) {
450
471
defaultMediaTypes .put ("xml" , MediaType .APPLICATION_XML_VALUE );
451
472
}
452
- if (jackson2Present || gsonPresent ) {
473
+ if (jacksonPresent || jackson2Present || gsonPresent ) {
453
474
defaultMediaTypes .put ("json" , MediaType .APPLICATION_JSON_VALUE );
454
475
}
455
- if (jackson2SmilePresent ) {
476
+ if (jacksonSmilePresent || jackson2SmilePresent ) {
456
477
defaultMediaTypes .put ("smile" , "application/x-jackson-smile" );
457
478
}
458
- if (jackson2CborPresent ) {
479
+ if (jacksonCborPresent || jackson2CborPresent ) {
459
480
defaultMediaTypes .put ("cbor" , MediaType .APPLICATION_CBOR_VALUE );
460
481
}
461
- if (jackson2YamlPresent ) {
482
+ if (jacksonYamlPresent || jackson2YamlPresent ) {
462
483
defaultMediaTypes .put ("yaml" , MediaType .APPLICATION_YAML_VALUE );
463
484
}
464
485
return defaultMediaTypes ;
@@ -568,7 +589,10 @@ private ManagedList<?> getMessageConverters(Element element, @Nullable Object so
568
589
messageConverters .add (createConverterDefinition (RssChannelHttpMessageConverter .class , source ));
569
590
}
570
591
571
- if (jackson2XmlPresent ) {
592
+ if (jacksonXmlPresent ) {
593
+ messageConverters .add (createConverterDefinition (JacksonXmlHttpMessageConverter .class , source ));
594
+ }
595
+ else if (jackson2XmlPresent ) {
572
596
Class <?> type = MappingJackson2XmlHttpMessageConverter .class ;
573
597
RootBeanDefinition jacksonConverterDef = createConverterDefinition (type , source );
574
598
GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition (source );
@@ -580,7 +604,10 @@ else if (jaxb2Present) {
580
604
messageConverters .add (createConverterDefinition (Jaxb2RootElementHttpMessageConverter .class , source ));
581
605
}
582
606
583
- if (jackson2Present ) {
607
+ if (jacksonPresent ) {
608
+ messageConverters .add (createConverterDefinition (JacksonJsonHttpMessageConverter .class , source ));
609
+ }
610
+ else if (jackson2Present ) {
584
611
Class <?> type = MappingJackson2HttpMessageConverter .class ;
585
612
RootBeanDefinition jacksonConverterDef = createConverterDefinition (type , source );
586
613
GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition (source );
@@ -591,23 +618,34 @@ else if (gsonPresent) {
591
618
messageConverters .add (createConverterDefinition (GsonHttpMessageConverter .class , source ));
592
619
}
593
620
594
- if (jackson2SmilePresent ) {
621
+ if (jacksonSmilePresent ) {
622
+ messageConverters .add (createConverterDefinition (JacksonSmileHttpMessageConverter .class , source ));
623
+ }
624
+ else if (jackson2SmilePresent ) {
595
625
Class <?> type = MappingJackson2SmileHttpMessageConverter .class ;
596
626
RootBeanDefinition jacksonConverterDef = createConverterDefinition (type , source );
597
627
GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition (source );
598
628
jacksonFactoryDef .getPropertyValues ().add ("factory" , new RootBeanDefinition (SmileFactory .class ));
599
629
jacksonConverterDef .getConstructorArgumentValues ().addIndexedArgumentValue (0 , jacksonFactoryDef );
600
630
messageConverters .add (jacksonConverterDef );
601
631
}
602
- if (jackson2CborPresent ) {
632
+
633
+ if (jacksonCborPresent ) {
634
+ messageConverters .add (createConverterDefinition (JacksonCborHttpMessageConverter .class , source ));
635
+ }
636
+ else if (jackson2CborPresent ) {
603
637
Class <?> type = MappingJackson2CborHttpMessageConverter .class ;
604
638
RootBeanDefinition jacksonConverterDef = createConverterDefinition (type , source );
605
639
GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition (source );
606
640
jacksonFactoryDef .getPropertyValues ().add ("factory" , new RootBeanDefinition (CBORFactory .class ));
607
641
jacksonConverterDef .getConstructorArgumentValues ().addIndexedArgumentValue (0 , jacksonFactoryDef );
608
642
messageConverters .add (jacksonConverterDef );
609
643
}
610
- if (jackson2YamlPresent ) {
644
+
645
+ if (jacksonYamlPresent ) {
646
+ messageConverters .add (createConverterDefinition (JacksonYamlHttpMessageConverter .class , source ));
647
+ }
648
+ else if (jackson2YamlPresent ) {
611
649
Class <?> type = MappingJackson2YamlHttpMessageConverter .class ;
612
650
RootBeanDefinition jacksonConverterDef = createConverterDefinition (type , source );
613
651
GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition (source );
0 commit comments