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 84fe8129a7b..6205afe68e7 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 @@ -422,6 +422,18 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate return (replyMessage != null ? (T) getMessageConverter().fromMessage(replyMessage, targetClass) : null); } + @Override + public @Nullable T convertSendAndReceive(Object request, @Nullable Map headers, + Class targetClass, @Nullable MessagePostProcessor postProcessor) throws MessagingException { + + Destination defaultDestination = getDefaultDestination(); + if (defaultDestination != null) { + return convertSendAndReceive(defaultDestination, request, headers, targetClass, postProcessor); + } + else { + return convertSendAndReceive(getRequiredDefaultDestinationName(), request, headers, targetClass, postProcessor); + } + } @Override protected void doSend(Destination destination, Message message) { 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 653843918da..049d551aecb 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 @@ -65,6 +65,7 @@ import static org.mockito.Mockito.verify; * * @author Stephane Nicoll * @author Juergen Hoeller + * @author Sam Brannen */ @ExtendWith(MockitoExtension.class) class JmsMessagingTemplateTests { @@ -565,7 +566,7 @@ class JmsMessagingTemplateTests { } @Test - void convertSendAndReceivePayload() { + void convertSendAndReceivePayloadWithDestination() { Destination destination = new Destination() {}; jakarta.jms.Message replyJmsMessage = createJmsTextMessage("My reply"); given(this.jmsTemplate.sendAndReceive(eq(destination), any())).willReturn(replyJmsMessage); @@ -576,7 +577,7 @@ class JmsMessagingTemplateTests { } @Test - void convertSendAndReceivePayloadName() { + void convertSendAndReceivePayloadWithDestinationName() { jakarta.jms.Message replyJmsMessage = createJmsTextMessage("My reply"); given(this.jmsTemplate.sendAndReceive(eq("myQueue"), any())).willReturn(replyJmsMessage); @@ -586,7 +587,7 @@ class JmsMessagingTemplateTests { } @Test - void convertSendAndReceiveDefaultDestination() { + void convertSendAndReceiveWithDefaultDestination() { Destination destination = new Destination() {}; this.messagingTemplate.setDefaultDestination(destination); jakarta.jms.Message replyJmsMessage = createJmsTextMessage("My reply"); @@ -597,8 +598,24 @@ class JmsMessagingTemplateTests { assertThat(reply).isEqualTo("My reply"); } + @Test // gh-36118 + void convertSendAndReceiveWithDefaultDestinationAndHeaders() { + Map headers = Map.of("foo", "bar"); + Object payload = "Hello"; + + Destination destination = new Destination() {}; + this.messagingTemplate.setDefaultDestination(destination); + jakarta.jms.Message replyJmsMessage = createJmsTextMessage("My reply"); + given(this.jmsTemplate.sendAndReceive(eq(destination), any())).willReturn(replyJmsMessage); + + String reply = this.messagingTemplate.convertSendAndReceive(payload, headers, String.class); + verify(this.jmsTemplate, times(1)).sendAndReceive(eq(destination), this.messageCreator.capture()); + assertTextMessage(this.messageCreator.getValue()); + assertThat(reply).isEqualTo("My reply"); + } + @Test - void convertSendAndReceiveDefaultDestinationName() { + void convertSendAndReceiveWithDefaultDestinationName() { this.messagingTemplate.setDefaultDestinationName("myQueue"); jakarta.jms.Message replyJmsMessage = createJmsTextMessage("My reply"); given(this.jmsTemplate.sendAndReceive(eq("myQueue"), any())).willReturn(replyJmsMessage); @@ -608,6 +625,21 @@ class JmsMessagingTemplateTests { assertThat(reply).isEqualTo("My reply"); } + @Test // gh-36118 + void convertSendAndReceiveWithDefaultDestinationNameAndHeaders() { + Map headers = Map.of("foo", "bar"); + Object payload = "Hello"; + + this.messagingTemplate.setDefaultDestinationName("myQueue"); + jakarta.jms.Message replyJmsMessage = createJmsTextMessage("My reply"); + given(this.jmsTemplate.sendAndReceive(eq("myQueue"), any())).willReturn(replyJmsMessage); + + String reply = this.messagingTemplate.convertSendAndReceive(payload, headers, String.class); + verify(this.jmsTemplate, times(1)).sendAndReceive(eq("myQueue"), this.messageCreator.capture()); + assertTextMessage(this.messageCreator.getValue()); + assertThat(reply).isEqualTo("My reply"); + } + @Test void convertSendAndReceiveNoDefaultSet() { assertThatIllegalStateException().isThrownBy(() ->