|
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