Skip to content

Commit 6ae89ea

Browse files
committed
Introduce Jackson 3 support to MessageBrokerBeanDefinitionParser
See gh-33798
1 parent 7acd4ae commit 6ae89ea

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -43,6 +43,7 @@
4343
import org.springframework.messaging.converter.CompositeMessageConverter;
4444
import org.springframework.messaging.converter.DefaultContentTypeResolver;
4545
import org.springframework.messaging.converter.GsonMessageConverter;
46+
import org.springframework.messaging.converter.JacksonJsonMessageConverter;
4647
import org.springframework.messaging.converter.JsonbMessageConverter;
4748
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
4849
import org.springframework.messaging.converter.StringMessageConverter;
@@ -98,6 +99,7 @@
9899
*
99100
* @author Brian Clozel
100101
* @author Rossen Stoyanchev
102+
* @author Sebastien Deleuze
101103
* @since 4.0
102104
*/
103105
class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
@@ -114,6 +116,8 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
114116

115117
private static final int DEFAULT_MAPPING_ORDER = 1;
116118

119+
private static final boolean jacksonPresent;
120+
117121
private static final boolean jackson2Present;
118122

119123
private static final boolean gsonPresent;
@@ -124,6 +128,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser {
124128

125129
static {
126130
ClassLoader classLoader = MessageBrokerBeanDefinitionParser.class.getClassLoader();
131+
jacksonPresent = ClassUtils.isPresent("tools.jackson.databind.ObjectMapper", classLoader);
127132
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
128133
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
129134
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
@@ -488,6 +493,7 @@ private RuntimeBeanReference registerUserRegistryMessageHandler(
488493
return new RuntimeBeanReference(beanName);
489494
}
490495

496+
@SuppressWarnings("removal")
491497
private RuntimeBeanReference registerMessageConverter(
492498
Element element, ParserContext context, @Nullable Object source) {
493499

@@ -504,7 +510,14 @@ private RuntimeBeanReference registerMessageConverter(
504510
converters.setSource(source);
505511
converters.add(new RootBeanDefinition(StringMessageConverter.class));
506512
converters.add(new RootBeanDefinition(ByteArrayMessageConverter.class));
507-
if (jackson2Present) {
513+
if (jacksonPresent) {
514+
RootBeanDefinition jacksonConverterDef = new RootBeanDefinition(JacksonJsonMessageConverter.class);
515+
RootBeanDefinition resolverDef = new RootBeanDefinition(DefaultContentTypeResolver.class);
516+
resolverDef.getPropertyValues().add("defaultMimeType", MimeTypeUtils.APPLICATION_JSON);
517+
jacksonConverterDef.getPropertyValues().add("contentTypeResolver", resolverDef);
518+
converters.add(jacksonConverterDef);
519+
}
520+
else if (jackson2Present) {
508521
RootBeanDefinition jacksonConverterDef = new RootBeanDefinition(MappingJackson2MessageConverter.class);
509522
RootBeanDefinition resolverDef = new RootBeanDefinition(DefaultContentTypeResolver.class);
510523
resolverDef.getPropertyValues().add("defaultMimeType", MimeTypeUtils.APPLICATION_JSON);

spring-websocket/src/test/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParserTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@
3939
import org.springframework.messaging.converter.CompositeMessageConverter;
4040
import org.springframework.messaging.converter.ContentTypeResolver;
4141
import org.springframework.messaging.converter.DefaultContentTypeResolver;
42-
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
42+
import org.springframework.messaging.converter.JacksonJsonMessageConverter;
4343
import org.springframework.messaging.converter.MessageConverter;
4444
import org.springframework.messaging.converter.StringMessageConverter;
4545
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
@@ -343,9 +343,9 @@ void annotationMethodMessageHandler() {
343343
assertThat(converters).hasSize(3);
344344
assertThat(converters).element(0).isInstanceOf(StringMessageConverter.class);
345345
assertThat(converters).element(1).isInstanceOf(ByteArrayMessageConverter.class);
346-
assertThat(converters).element(2).isInstanceOf(MappingJackson2MessageConverter.class);
346+
assertThat(converters).element(2).isInstanceOf(JacksonJsonMessageConverter.class);
347347

348-
ContentTypeResolver resolver = ((MappingJackson2MessageConverter) converters.get(2)).getContentTypeResolver();
348+
ContentTypeResolver resolver = ((JacksonJsonMessageConverter) converters.get(2)).getContentTypeResolver();
349349
assertThat(((DefaultContentTypeResolver) resolver).getDefaultMimeType()).isEqualTo(MimeTypeUtils.APPLICATION_JSON);
350350

351351
DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(annotationMethodMessageHandler);

0 commit comments

Comments
 (0)