Skip to content

Commit b275a06

Browse files
committed
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
1 parent 7aa956a commit b275a06

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

spring-jms/src/main/java/org/springframework/jms/core/JmsMessagingTemplate.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate<Destination>
5252

5353
private MessageConverter jmsMessageConverter = new MessagingMessageConverter();
5454

55+
private boolean converterSet;
56+
5557
@Nullable
5658
private String defaultDestinationName;
5759

@@ -131,6 +133,7 @@ public JmsTemplate getJmsTemplate() {
131133
public void setJmsMessageConverter(MessageConverter jmsMessageConverter) {
132134
Assert.notNull(jmsMessageConverter, "MessageConverter must not be null");
133135
this.jmsMessageConverter = jmsMessageConverter;
136+
this.converterSet = true;
134137
}
135138

136139
/**
@@ -162,6 +165,10 @@ public String getDefaultDestinationName() {
162165
@Override
163166
public void afterPropertiesSet() {
164167
Assert.notNull(this.jmsTemplate, "Property 'connectionFactory' or 'jmsTemplate' is required");
168+
if (!this.converterSet && this.jmsTemplate.getMessageConverter() != null) {
169+
((MessagingMessageConverter) this.jmsMessageConverter)
170+
.setPayloadConverter(this.jmsTemplate.getMessageConverter());
171+
}
165172
}
166173

167174
private JmsTemplate obtainJmsTemplate() {

spring-jms/src/main/java/org/springframework/jms/support/converter/MessagingMessageConverter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ public MessagingMessageConverter() {
5555
this(new SimpleMessageConverter(), new SimpleJmsHeaderMapper());
5656
}
5757

58+
/**
59+
* Create an instance with the specific payload converter.
60+
* @param payloadConverter the payload converter to use
61+
* @since 4.3.12
62+
*/
63+
public MessagingMessageConverter(MessageConverter payloadConverter) {
64+
this(payloadConverter, new SimpleJmsHeaderMapper());
65+
}
66+
5867
/**
5968
* Create an instance with the specified payload converter and
6069
* header mapper.

spring-jms/src/test/java/org/springframework/jms/core/JmsMessagingTemplateTests.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2016 the original author or authors.
2+
* Copyright 2002-2017 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.
@@ -36,13 +36,14 @@
3636
import org.mockito.Captor;
3737
import org.mockito.Mock;
3838
import org.mockito.MockitoAnnotations;
39-
import org.mockito.invocation.InvocationOnMock;
4039
import org.mockito.stubbing.Answer;
4140

41+
import org.springframework.beans.DirectFieldAccessor;
4242
import org.springframework.jms.InvalidDestinationException;
4343
import org.springframework.jms.MessageNotReadableException;
4444
import org.springframework.jms.StubTextMessage;
4545
import org.springframework.jms.support.converter.MessageConverter;
46+
import org.springframework.jms.support.converter.MessagingMessageConverter;
4647
import org.springframework.jms.support.converter.SimpleMessageConverter;
4748
import org.springframework.jms.support.destination.DestinationResolutionException;
4849
import org.springframework.messaging.Message;
@@ -83,6 +84,47 @@ public void validateJmsTemplate() {
8384
assertSame(this.jmsTemplate, this.messagingTemplate.getJmsTemplate());
8485
}
8586

87+
@Test
88+
public void payloadConverterIsConsistentConstructor() {
89+
MessageConverter messageConverter = mock(MessageConverter.class);
90+
given(this.jmsTemplate.getMessageConverter()).willReturn(messageConverter);
91+
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(this.jmsTemplate);
92+
messagingTemplate.afterPropertiesSet();
93+
assertPayloadConverter(messagingTemplate, messageConverter);
94+
}
95+
96+
@Test
97+
public void payloadConverterIsConsistentSetter() {
98+
MessageConverter messageConverter = mock(MessageConverter.class);
99+
given(this.jmsTemplate.getMessageConverter()).willReturn(messageConverter);
100+
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate();
101+
messagingTemplate.setJmsTemplate(this.jmsTemplate);
102+
messagingTemplate.afterPropertiesSet();
103+
assertPayloadConverter(messagingTemplate, messageConverter);
104+
}
105+
106+
@Test
107+
public void customConverterAlwaysTakesPrecedence() {
108+
MessageConverter messageConverter = mock(MessageConverter.class);
109+
given(this.jmsTemplate.getMessageConverter()).willReturn(messageConverter);
110+
MessageConverter customMessageConverter = mock(MessageConverter.class);
111+
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate();
112+
messagingTemplate.setJmsMessageConverter(
113+
new MessagingMessageConverter(customMessageConverter));
114+
messagingTemplate.setJmsTemplate(this.jmsTemplate);
115+
messagingTemplate.afterPropertiesSet();
116+
assertPayloadConverter(messagingTemplate, customMessageConverter);
117+
}
118+
119+
private void assertPayloadConverter(JmsMessagingTemplate messagingTemplate,
120+
MessageConverter messageConverter) {
121+
MessageConverter jmsMessageConverter = messagingTemplate.getJmsMessageConverter();
122+
assertNotNull(jmsMessageConverter);
123+
assertEquals(MessagingMessageConverter.class, jmsMessageConverter.getClass());
124+
assertSame(messageConverter, new DirectFieldAccessor(jmsMessageConverter)
125+
.getPropertyValue("payloadConverter"));
126+
}
127+
86128
@Test
87129
public void send() {
88130
Destination destination = new Destination() {};

0 commit comments

Comments
 (0)