Introduce Jackson 3 support to MessageBrokerBeanDefinitionParser
See gh-33798
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2024 the original author or authors.
|
* Copyright 2002-2025 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -43,6 +43,7 @@ import org.springframework.messaging.converter.ByteArrayMessageConverter;
|
|||||||
import org.springframework.messaging.converter.CompositeMessageConverter;
|
import org.springframework.messaging.converter.CompositeMessageConverter;
|
||||||
import org.springframework.messaging.converter.DefaultContentTypeResolver;
|
import org.springframework.messaging.converter.DefaultContentTypeResolver;
|
||||||
import org.springframework.messaging.converter.GsonMessageConverter;
|
import org.springframework.messaging.converter.GsonMessageConverter;
|
||||||
|
import org.springframework.messaging.converter.JacksonJsonMessageConverter;
|
||||||
import org.springframework.messaging.converter.JsonbMessageConverter;
|
import org.springframework.messaging.converter.JsonbMessageConverter;
|
||||||
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
|
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
|
||||||
import org.springframework.messaging.converter.StringMessageConverter;
|
import org.springframework.messaging.converter.StringMessageConverter;
|
||||||
@@ -98,6 +99,7 @@ import org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler;
|
|||||||
*
|
*
|
||||||
* @author Brian Clozel
|
* @author Brian Clozel
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
|
* @author Sebastien Deleuze
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
||||||
@@ -114,6 +116,8 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
|
|
||||||
private static final int DEFAULT_MAPPING_ORDER = 1;
|
private static final int DEFAULT_MAPPING_ORDER = 1;
|
||||||
|
|
||||||
|
private static final boolean jacksonPresent;
|
||||||
|
|
||||||
private static final boolean jackson2Present;
|
private static final boolean jackson2Present;
|
||||||
|
|
||||||
private static final boolean gsonPresent;
|
private static final boolean gsonPresent;
|
||||||
@@ -124,6 +128,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
ClassLoader classLoader = MessageBrokerBeanDefinitionParser.class.getClassLoader();
|
ClassLoader classLoader = MessageBrokerBeanDefinitionParser.class.getClassLoader();
|
||||||
|
jacksonPresent = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader);
|
||||||
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
|
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
|
||||||
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
|
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
|
||||||
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
|
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
|
||||||
@@ -488,6 +493,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
return new RuntimeBeanReference(beanName);
|
return new RuntimeBeanReference(beanName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("removal")
|
||||||
private RuntimeBeanReference registerMessageConverter(
|
private RuntimeBeanReference registerMessageConverter(
|
||||||
Element element, ParserContext context, @Nullable Object source) {
|
Element element, ParserContext context, @Nullable Object source) {
|
||||||
|
|
||||||
@@ -504,7 +510,14 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
|
|||||||
converters.setSource(source);
|
converters.setSource(source);
|
||||||
converters.add(new RootBeanDefinition(StringMessageConverter.class));
|
converters.add(new RootBeanDefinition(StringMessageConverter.class));
|
||||||
converters.add(new RootBeanDefinition(ByteArrayMessageConverter.class));
|
converters.add(new RootBeanDefinition(ByteArrayMessageConverter.class));
|
||||||
if (jackson2Present) {
|
if (jacksonPresent) {
|
||||||
|
RootBeanDefinition jacksonConverterDef = new RootBeanDefinition(JacksonJsonMessageConverter.class);
|
||||||
|
RootBeanDefinition resolverDef = new RootBeanDefinition(DefaultContentTypeResolver.class);
|
||||||
|
resolverDef.getPropertyValues().add("defaultMimeType", MimeTypeUtils.APPLICATION_JSON);
|
||||||
|
jacksonConverterDef.getPropertyValues().add("contentTypeResolver", resolverDef);
|
||||||
|
converters.add(jacksonConverterDef);
|
||||||
|
}
|
||||||
|
else if (jackson2Present) {
|
||||||
RootBeanDefinition jacksonConverterDef = new RootBeanDefinition(MappingJackson2MessageConverter.class);
|
RootBeanDefinition jacksonConverterDef = new RootBeanDefinition(MappingJackson2MessageConverter.class);
|
||||||
RootBeanDefinition resolverDef = new RootBeanDefinition(DefaultContentTypeResolver.class);
|
RootBeanDefinition resolverDef = new RootBeanDefinition(DefaultContentTypeResolver.class);
|
||||||
resolverDef.getPropertyValues().add("defaultMimeType", MimeTypeUtils.APPLICATION_JSON);
|
resolverDef.getPropertyValues().add("defaultMimeType", MimeTypeUtils.APPLICATION_JSON);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2024 the original author or authors.
|
* Copyright 2002-2025 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -39,7 +39,7 @@ import org.springframework.messaging.converter.ByteArrayMessageConverter;
|
|||||||
import org.springframework.messaging.converter.CompositeMessageConverter;
|
import org.springframework.messaging.converter.CompositeMessageConverter;
|
||||||
import org.springframework.messaging.converter.ContentTypeResolver;
|
import org.springframework.messaging.converter.ContentTypeResolver;
|
||||||
import org.springframework.messaging.converter.DefaultContentTypeResolver;
|
import org.springframework.messaging.converter.DefaultContentTypeResolver;
|
||||||
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
|
import org.springframework.messaging.converter.JacksonJsonMessageConverter;
|
||||||
import org.springframework.messaging.converter.MessageConverter;
|
import org.springframework.messaging.converter.MessageConverter;
|
||||||
import org.springframework.messaging.converter.StringMessageConverter;
|
import org.springframework.messaging.converter.StringMessageConverter;
|
||||||
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
|
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
|
||||||
@@ -343,9 +343,9 @@ class MessageBrokerBeanDefinitionParserTests {
|
|||||||
assertThat(converters).hasSize(3);
|
assertThat(converters).hasSize(3);
|
||||||
assertThat(converters).element(0).isInstanceOf(StringMessageConverter.class);
|
assertThat(converters).element(0).isInstanceOf(StringMessageConverter.class);
|
||||||
assertThat(converters).element(1).isInstanceOf(ByteArrayMessageConverter.class);
|
assertThat(converters).element(1).isInstanceOf(ByteArrayMessageConverter.class);
|
||||||
assertThat(converters).element(2).isInstanceOf(MappingJackson2MessageConverter.class);
|
assertThat(converters).element(2).isInstanceOf(JacksonJsonMessageConverter.class);
|
||||||
|
|
||||||
ContentTypeResolver resolver = ((MappingJackson2MessageConverter) converters.get(2)).getContentTypeResolver();
|
ContentTypeResolver resolver = ((JacksonJsonMessageConverter) converters.get(2)).getContentTypeResolver();
|
||||||
assertThat(((DefaultContentTypeResolver) resolver).getDefaultMimeType()).isEqualTo(MimeTypeUtils.APPLICATION_JSON);
|
assertThat(((DefaultContentTypeResolver) resolver).getDefaultMimeType()).isEqualTo(MimeTypeUtils.APPLICATION_JSON);
|
||||||
|
|
||||||
DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(annotationMethodMessageHandler);
|
DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(annotationMethodMessageHandler);
|
||||||
|
|||||||
Reference in New Issue
Block a user