|
16 | 16 |
|
17 | 17 | package org.springframework.web.servlet.config.annotation;
|
18 | 18 |
|
| 19 | +import java.nio.charset.StandardCharsets; |
19 | 20 | import java.util.ArrayList;
|
20 | 21 | import java.util.HashMap;
|
21 | 22 | import java.util.List;
|
22 | 23 | import java.util.Locale;
|
23 | 24 | import java.util.Map;
|
| 25 | +import java.util.Set; |
| 26 | +import java.util.stream.Collectors; |
24 | 27 |
|
25 | 28 | import jakarta.servlet.ServletContext;
|
26 | 29 | import org.jspecify.annotations.Nullable;
|
|
177 | 180 | */
|
178 | 181 | public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
|
179 | 182 |
|
180 |
| - private static final boolean romePresent; |
181 |
| - |
182 |
| - private static final boolean jaxb2Present; |
183 |
| - |
184 | 183 | private static final boolean jacksonPresent;
|
185 | 184 |
|
186 | 185 | private static final boolean jackson2Present;
|
187 | 186 |
|
188 |
| - private static final boolean jacksonXmlPresent; |
189 |
| - |
190 |
| - private static final boolean jackson2XmlPresent; |
191 |
| - |
192 |
| - private static final boolean jacksonSmilePresent; |
193 |
| - |
194 |
| - private static final boolean jackson2SmilePresent; |
195 |
| - |
196 |
| - private static final boolean jacksonCborPresent; |
197 |
| - |
198 |
| - private static final boolean jackson2CborPresent; |
199 |
| - |
200 |
| - private static final boolean jacksonYamlPresent; |
201 |
| - |
202 |
| - private static final boolean jackson2YamlPresent; |
203 |
| - |
204 |
| - private static final boolean gsonPresent; |
205 |
| - |
206 |
| - private static final boolean jsonbPresent; |
207 |
| - |
208 | 187 | private static final boolean kotlinSerializationPresent;
|
209 | 188 |
|
210 |
| - private static final boolean kotlinSerializationCborPresent; |
211 |
| - |
212 |
| - private static final boolean kotlinSerializationJsonPresent; |
213 |
| - |
214 |
| - private static final boolean kotlinSerializationProtobufPresent; |
215 | 189 |
|
216 | 190 | static {
|
217 | 191 | ClassLoader classLoader = WebMvcConfigurationSupport.class.getClassLoader();
|
218 |
| - romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader); |
219 |
| - jaxb2Present = ClassUtils.isPresent("jakarta.xml.bind.Binder", classLoader); |
220 | 192 | jacksonPresent = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader);
|
221 | 193 | jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
|
222 | 194 | ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
|
223 |
| - jacksonXmlPresent = jacksonPresent && ClassUtils.isPresent("tools.jackson.dataformat.xml.XmlMapper", classLoader); |
224 |
| - jackson2XmlPresent = jackson2Present && ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader); |
225 |
| - jacksonSmilePresent = jacksonPresent && ClassUtils.isPresent("tools.jackson.dataformat.smile.SmileMapper", classLoader); |
226 |
| - jackson2SmilePresent = jackson2Present && ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader); |
227 |
| - jacksonCborPresent = jacksonPresent && ClassUtils.isPresent("tools.jackson.dataformat.cbor.CBORMapper", classLoader); |
228 |
| - jackson2CborPresent = jackson2Present && ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader); |
229 |
| - jacksonYamlPresent = jacksonPresent && ClassUtils.isPresent("tools.jackson.dataformat.yaml.YAMLMapper", classLoader); |
230 |
| - jackson2YamlPresent = jackson2Present && ClassUtils.isPresent("com.fasterxml.jackson.dataformat.yaml.YAMLFactory", classLoader); |
231 |
| - gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader); |
232 |
| - jsonbPresent = ClassUtils.isPresent("jakarta.json.bind.Jsonb", classLoader); |
233 | 195 | kotlinSerializationPresent = ClassUtils.isPresent("kotlinx.serialization.Serializable", classLoader);
|
234 |
| - kotlinSerializationCborPresent = kotlinSerializationPresent && ClassUtils.isPresent("kotlinx.serialization.cbor.Cbor", classLoader); |
235 |
| - kotlinSerializationJsonPresent = kotlinSerializationPresent && ClassUtils.isPresent("kotlinx.serialization.json.Json", classLoader); |
236 |
| - kotlinSerializationProtobufPresent = kotlinSerializationPresent && ClassUtils.isPresent("kotlinx.serialization.protobuf.ProtoBuf", classLoader); |
237 | 196 | }
|
238 | 197 |
|
239 | 198 |
|
@@ -444,23 +403,32 @@ public ContentNegotiationManager mvcContentNegotiationManager() {
|
444 | 403 |
|
445 | 404 | protected Map<String, MediaType> getDefaultMediaTypes() {
|
446 | 405 | Map<String, MediaType> map = new HashMap<>(4);
|
447 |
| - if (romePresent) { |
| 406 | + List<HttpMessageConverter<?>> messageConverters = getMessageConverters(); |
| 407 | + Set<MediaType> supportedMediaTypes = messageConverters.stream() |
| 408 | + .flatMap(converter -> converter.getSupportedMediaTypes().stream()) |
| 409 | + .collect(Collectors.toSet()); |
| 410 | + if (supportedMediaTypes.contains(MediaType.APPLICATION_ATOM_XML)) { |
448 | 411 | map.put("atom", MediaType.APPLICATION_ATOM_XML);
|
| 412 | + } |
| 413 | + if (supportedMediaTypes.contains(MediaType.APPLICATION_RSS_XML)) { |
449 | 414 | map.put("rss", MediaType.APPLICATION_RSS_XML);
|
450 | 415 | }
|
451 |
| - if (jaxb2Present || jacksonXmlPresent || jackson2XmlPresent) { |
| 416 | + MediaType xmlUtf8MediaType = new MediaType("application", "xml", StandardCharsets.UTF_8); |
| 417 | + if (supportedMediaTypes.contains(MediaType.APPLICATION_XML) || |
| 418 | + supportedMediaTypes.contains(xmlUtf8MediaType)) { |
452 | 419 | map.put("xml", MediaType.APPLICATION_XML);
|
453 | 420 | }
|
454 |
| - if (jacksonPresent || jackson2Present || gsonPresent || jsonbPresent || kotlinSerializationJsonPresent) { |
| 421 | + if (supportedMediaTypes.contains(MediaType.APPLICATION_JSON)) { |
455 | 422 | map.put("json", MediaType.APPLICATION_JSON);
|
456 | 423 | }
|
457 |
| - if (jacksonSmilePresent || jackson2SmilePresent) { |
458 |
| - map.put("smile", MediaType.valueOf("application/x-jackson-smile")); |
| 424 | + MediaType smileMediaType = new MediaType("application", "x-jackson-smile"); |
| 425 | + if (supportedMediaTypes.contains(smileMediaType)) { |
| 426 | + map.put("smile", smileMediaType); |
459 | 427 | }
|
460 |
| - if (jacksonCborPresent || jackson2CborPresent || kotlinSerializationCborPresent) { |
| 428 | + if (supportedMediaTypes.contains(MediaType.APPLICATION_CBOR)) { |
461 | 429 | map.put("cbor", MediaType.APPLICATION_CBOR);
|
462 | 430 | }
|
463 |
| - if (jacksonYamlPresent || jackson2YamlPresent) { |
| 431 | + if (supportedMediaTypes.contains(MediaType.APPLICATION_ATOM_XML)) { |
464 | 432 | map.put("yaml", MediaType.APPLICATION_YAML);
|
465 | 433 | }
|
466 | 434 | return map;
|
|
0 commit comments