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
This commit is contained in:
Stephane Nicoll 2017-09-18 14:27:47 +02:00
parent 7aa956a920
commit b275a06d16
3 changed files with 60 additions and 2 deletions

View File

@ -52,6 +52,8 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate<Destination>
private MessageConverter jmsMessageConverter = new MessagingMessageConverter();
private boolean converterSet;
@Nullable
private String defaultDestinationName;
@ -131,6 +133,7 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate<Destination>
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<Destination>
@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() {

View File

@ -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.

View File

@ -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() {};