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:
parent
7aa956a920
commit
b275a06d16
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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() {};
|
||||
|
|
|
|||
Loading…
Reference in New Issue