diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java index 97790e42ed..127079b210 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java @@ -248,27 +248,44 @@ public abstract class AbstractMessageBrokerConfiguration implements ApplicationC @Bean public CompositeMessageConverter brokerMessageConverter() { + List converters = new ArrayList(); - if (configureMessageConverters(converters)) { + boolean registerDefaults = configureMessageConverters(converters); + if (registerDefaults) { if (jackson2Present) { converters.add(new MappingJackson2MessageConverter()); } converters.add(new StringMessageConverter()); converters.add(new ByteArrayMessageConverter()); } - return new CompositeMessageConverter(converters, getContentTypeResolver()); + + ContentTypeResolver contentTypeResolver = getContentTypeResolver(); + if (contentTypeResolver == null) { + contentTypeResolver = new DefaultContentTypeResolver(); + if (jackson2Present && registerDefaults) { + ((DefaultContentTypeResolver) contentTypeResolver).setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON); + } + } + + return new CompositeMessageConverter(converters, contentTypeResolver); } + /** + * Override this method to add custom message converters. + * @param messageConverters the list to add converters to, initially empty + * + * @return {@code true} if default message converters should be added to list, + * {@code false} if no more converters should be added. + */ protected boolean configureMessageConverters(List messageConverters) { return true; } + /** + * Override this method to provide a custom {@link ContentTypeResolver}. + */ protected ContentTypeResolver getContentTypeResolver() { - DefaultContentTypeResolver contentTypeResolver = new DefaultContentTypeResolver(); - if (jackson2Present) { - contentTypeResolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON); - } - return contentTypeResolver; + return null; } @Bean diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java index 55ecc33a14..28a13c9a88 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/config/MessageBrokerConfigurationTests.java @@ -270,15 +270,6 @@ public class MessageBrokerConfigurationTests { assertEquals(33, taskExecutor.getKeepAliveSeconds()); } - @Test - public void messageConverter() { - CompositeMessageConverter messageConverter = this.brokerRelayContext.getBean( - "brokerMessageConverter", CompositeMessageConverter.class); - - DefaultContentTypeResolver resolver = (DefaultContentTypeResolver) messageConverter.getContentTypeResolver(); - assertEquals(MimeTypeUtils.APPLICATION_JSON, resolver.getDefaultMimeType()); - } - @Test public void configureMessageConvertersDefault() { AbstractMessageBrokerConfiguration config = new AbstractMessageBrokerConfiguration() {}; @@ -289,6 +280,9 @@ public class MessageBrokerConfigurationTests { assertThat(iterator.next(), Matchers.instanceOf(MappingJackson2MessageConverter.class)); assertThat(iterator.next(), Matchers.instanceOf(StringMessageConverter.class)); assertThat(iterator.next(), Matchers.instanceOf(ByteArrayMessageConverter.class)); + + DefaultContentTypeResolver resolver = (DefaultContentTypeResolver) compositeConverter.getContentTypeResolver(); + assertEquals(MimeTypeUtils.APPLICATION_JSON, resolver.getDefaultMimeType()); } @Test @@ -301,11 +295,14 @@ public class MessageBrokerConfigurationTests { return false; } }; - CompositeMessageConverter compositeConverter = config.brokerMessageConverter(); + CompositeMessageConverter compositeConverter = config.brokerMessageConverter(); assertThat(compositeConverter.getConverters().size(), Matchers.is(1)); Iterator iterator = compositeConverter.getConverters().iterator(); assertThat(iterator.next(), Matchers.is(testConverter)); + + DefaultContentTypeResolver resolver = (DefaultContentTypeResolver) compositeConverter.getContentTypeResolver(); + assertNull(resolver.getDefaultMimeType()); } @Test @@ -328,6 +325,9 @@ public class MessageBrokerConfigurationTests { assertThat(iterator.next(), Matchers.instanceOf(MappingJackson2MessageConverter.class)); assertThat(iterator.next(), Matchers.instanceOf(StringMessageConverter.class)); assertThat(iterator.next(), Matchers.instanceOf(ByteArrayMessageConverter.class)); + + DefaultContentTypeResolver resolver = (DefaultContentTypeResolver) compositeConverter.getContentTypeResolver(); + assertEquals(MimeTypeUtils.APPLICATION_JSON, resolver.getDefaultMimeType()); } @Test