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 MessageConverter jmsMessageConverter = new MessagingMessageConverter();
|
||||||
|
|
||||||
|
private boolean converterSet;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private String defaultDestinationName;
|
private String defaultDestinationName;
|
||||||
|
|
||||||
|
|
@ -131,6 +133,7 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate<Destination>
|
||||||
public void setJmsMessageConverter(MessageConverter jmsMessageConverter) {
|
public void setJmsMessageConverter(MessageConverter jmsMessageConverter) {
|
||||||
Assert.notNull(jmsMessageConverter, "MessageConverter must not be null");
|
Assert.notNull(jmsMessageConverter, "MessageConverter must not be null");
|
||||||
this.jmsMessageConverter = jmsMessageConverter;
|
this.jmsMessageConverter = jmsMessageConverter;
|
||||||
|
this.converterSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -162,6 +165,10 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate<Destination>
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
Assert.notNull(this.jmsTemplate, "Property 'connectionFactory' or 'jmsTemplate' is required");
|
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() {
|
private JmsTemplate obtainJmsTemplate() {
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,15 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
|
||||||
this(new SimpleMessageConverter(), new SimpleJmsHeaderMapper());
|
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
|
* Create an instance with the specified payload converter and
|
||||||
* header mapper.
|
* 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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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.Captor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
|
||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
|
import org.springframework.beans.DirectFieldAccessor;
|
||||||
import org.springframework.jms.InvalidDestinationException;
|
import org.springframework.jms.InvalidDestinationException;
|
||||||
import org.springframework.jms.MessageNotReadableException;
|
import org.springframework.jms.MessageNotReadableException;
|
||||||
import org.springframework.jms.StubTextMessage;
|
import org.springframework.jms.StubTextMessage;
|
||||||
import org.springframework.jms.support.converter.MessageConverter;
|
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.converter.SimpleMessageConverter;
|
||||||
import org.springframework.jms.support.destination.DestinationResolutionException;
|
import org.springframework.jms.support.destination.DestinationResolutionException;
|
||||||
import org.springframework.messaging.Message;
|
import org.springframework.messaging.Message;
|
||||||
|
|
@ -83,6 +84,47 @@ public class JmsMessagingTemplateTests {
|
||||||
assertSame(this.jmsTemplate, this.messagingTemplate.getJmsTemplate());
|
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
|
@Test
|
||||||
public void send() {
|
public void send() {
|
||||||
Destination destination = new Destination() {};
|
Destination destination = new Destination() {};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue