From b275a06d167773df0efdc76884ad7c2067ab9e2b Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 18 Sep 2017 14:27:47 +0200 Subject: [PATCH] Reuse JmsTemplate's MessageConverter in JmsMessagingTemplate This commit makes sure that any custom MessageConverter set in a JmsTemplate used by a JmsMessagingTemplate is reused as the payload converter of the message. Issue: SPR-15965 --- .../jms/core/JmsMessagingTemplate.java | 7 +++ .../converter/MessagingMessageConverter.java | 9 ++++ .../jms/core/JmsMessagingTemplateTests.java | 46 ++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/core/JmsMessagingTemplate.java b/spring-jms/src/main/java/org/springframework/jms/core/JmsMessagingTemplate.java index 8dc19c14d4f..35a7def54c9 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/JmsMessagingTemplate.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/JmsMessagingTemplate.java @@ -52,6 +52,8 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate private MessageConverter jmsMessageConverter = new MessagingMessageConverter(); + private boolean converterSet; + @Nullable private String defaultDestinationName; @@ -131,6 +133,7 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate public void setJmsMessageConverter(MessageConverter jmsMessageConverter) { Assert.notNull(jmsMessageConverter, "MessageConverter must not be null"); this.jmsMessageConverter = jmsMessageConverter; + this.converterSet = true; } /** @@ -162,6 +165,10 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate @Override public void afterPropertiesSet() { Assert.notNull(this.jmsTemplate, "Property 'connectionFactory' or 'jmsTemplate' is required"); + if (!this.converterSet && this.jmsTemplate.getMessageConverter() != null) { + ((MessagingMessageConverter) this.jmsMessageConverter) + .setPayloadConverter(this.jmsTemplate.getMessageConverter()); + } } private JmsTemplate obtainJmsTemplate() { diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/MessagingMessageConverter.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/MessagingMessageConverter.java index 9ea0e9b817f..16b5137efe7 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/MessagingMessageConverter.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/MessagingMessageConverter.java @@ -55,6 +55,15 @@ public class MessagingMessageConverter implements MessageConverter, Initializing this(new SimpleMessageConverter(), new SimpleJmsHeaderMapper()); } + /** + * Create an instance with the specific payload converter. + * @param payloadConverter the payload converter to use + * @since 4.3.12 + */ + public MessagingMessageConverter(MessageConverter payloadConverter) { + this(payloadConverter, new SimpleJmsHeaderMapper()); + } + /** * Create an instance with the specified payload converter and * header mapper. diff --git a/spring-jms/src/test/java/org/springframework/jms/core/JmsMessagingTemplateTests.java b/spring-jms/src/test/java/org/springframework/jms/core/JmsMessagingTemplateTests.java index 4eed03e395c..c1097c0ab17 100644 --- a/spring-jms/src/test/java/org/springframework/jms/core/JmsMessagingTemplateTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/core/JmsMessagingTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,13 +36,14 @@ import org.mockito.BDDMockito; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.springframework.beans.DirectFieldAccessor; import org.springframework.jms.InvalidDestinationException; import org.springframework.jms.MessageNotReadableException; import org.springframework.jms.StubTextMessage; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.converter.MessagingMessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.destination.DestinationResolutionException; import org.springframework.messaging.Message; @@ -83,6 +84,47 @@ public class JmsMessagingTemplateTests { assertSame(this.jmsTemplate, this.messagingTemplate.getJmsTemplate()); } + @Test + public void payloadConverterIsConsistentConstructor() { + MessageConverter messageConverter = mock(MessageConverter.class); + given(this.jmsTemplate.getMessageConverter()).willReturn(messageConverter); + JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(this.jmsTemplate); + messagingTemplate.afterPropertiesSet(); + assertPayloadConverter(messagingTemplate, messageConverter); + } + + @Test + public void payloadConverterIsConsistentSetter() { + MessageConverter messageConverter = mock(MessageConverter.class); + given(this.jmsTemplate.getMessageConverter()).willReturn(messageConverter); + JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(); + messagingTemplate.setJmsTemplate(this.jmsTemplate); + messagingTemplate.afterPropertiesSet(); + assertPayloadConverter(messagingTemplate, messageConverter); + } + + @Test + public void customConverterAlwaysTakesPrecedence() { + MessageConverter messageConverter = mock(MessageConverter.class); + given(this.jmsTemplate.getMessageConverter()).willReturn(messageConverter); + MessageConverter customMessageConverter = mock(MessageConverter.class); + JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(); + messagingTemplate.setJmsMessageConverter( + new MessagingMessageConverter(customMessageConverter)); + messagingTemplate.setJmsTemplate(this.jmsTemplate); + messagingTemplate.afterPropertiesSet(); + assertPayloadConverter(messagingTemplate, customMessageConverter); + } + + private void assertPayloadConverter(JmsMessagingTemplate messagingTemplate, + MessageConverter messageConverter) { + MessageConverter jmsMessageConverter = messagingTemplate.getJmsMessageConverter(); + assertNotNull(jmsMessageConverter); + assertEquals(MessagingMessageConverter.class, jmsMessageConverter.getClass()); + assertSame(messageConverter, new DirectFieldAccessor(jmsMessageConverter) + .getPropertyValue("payloadConverter")); + } + @Test public void send() { Destination destination = new Destination() {};