Skip to content

Commit 12159b9

Browse files
snicolljhoeller
authored andcommitted
Provide best-effort toString for Lazy resolved message
Previously, MessagingMessageListenerAdapter or any adapter relying on the default MessagingMessageConverter would log an incoming message with a toString of the Message that does not provide any extra information. This is due to the default implementation providing a lazy resolution message that only attempts to extract the payload when necessary. This commit implements a toString method that uses the raw JMS message if the payload is not available. If it is, the payload is used instead. Closes gh-21265 (cherry picked from commit a37abd5)
1 parent 7a8ec2a commit 12159b9

File tree

2 files changed

+67
-4
lines changed

2 files changed

+67
-4
lines changed

spring-jms/src/main/java/org/springframework/jms/listener/adapter/AbstractAdaptableMessageListener.java

+26-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2023 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.
@@ -304,8 +304,8 @@ protected void handleResult(Object result, Message request, @Nullable Session se
304304
* @see #setMessageConverter
305305
*/
306306
protected Message buildMessage(Session session, Object result) throws JMSException {
307-
Object content = preProcessResponse(result instanceof JmsResponse
308-
? ((JmsResponse<?>) result).getResponse() : result);
307+
Object content = preProcessResponse(result instanceof JmsResponse ?
308+
((JmsResponse<?>) result).getResponse() : result);
309309

310310
MessageConverter converter = getMessageConverter();
311311
if (converter != null) {
@@ -553,6 +553,29 @@ public MessageHeaders getHeaders() {
553553
}
554554
return this.headers;
555555
}
556+
557+
@Override
558+
public String toString() {
559+
StringBuilder sb = new StringBuilder(getClass().getSimpleName());
560+
if (this.payload == null) {
561+
sb.append(" [rawMessage=").append(this.message);
562+
}
563+
else {
564+
sb.append(" [payload=");
565+
if (this.payload instanceof byte[]) {
566+
sb.append("byte[").append(((byte[]) this.payload).length).append(']');
567+
}
568+
else {
569+
sb.append(this.payload);
570+
}
571+
}
572+
if (this.headers != null) {
573+
sb.append(", headers=").append(this.headers);
574+
}
575+
sb.append(']');
576+
return sb.toString();
577+
}
578+
556579
}
557580
}
558581

spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessagingMessageListenerAdapterTests.java

+41-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2023 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.
@@ -40,6 +40,7 @@
4040
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
4141
import org.springframework.jms.support.converter.MessageConverter;
4242
import org.springframework.jms.support.converter.MessageType;
43+
import org.springframework.jms.support.converter.MessagingMessageConverter;
4344
import org.springframework.messaging.Message;
4445
import org.springframework.messaging.converter.MessageConversionException;
4546
import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
@@ -340,6 +341,45 @@ public TextMessage testReplyWithJackson(String methodName, String replyContent)
340341
return responseMessage;
341342
}
342343

344+
@Test
345+
void lazyResolutionMessageToStringProvidesBestEffortWithUnresolvedPayload() throws JMSException {
346+
MessagingMessageListenerAdapter adapter = getSimpleInstance("echo", Message.class);
347+
MessagingMessageConverter messagingMessageConverter = adapter.getMessagingMessageConverter();
348+
assertThat(messagingMessageConverter).isNotNull();
349+
TextMessage message = new StubTextMessage();
350+
assertThat(messagingMessageConverter.fromMessage(message)).isInstanceOfSatisfying(Message.class, msg ->
351+
assertThat(msg.toString()).contains("rawMessage=").contains(message.toString())
352+
.doesNotContain("payload=").doesNotContain("headers="));
353+
}
354+
355+
@Test
356+
void lazyResolutionMessageToStringWithResolvedPayload() throws JMSException {
357+
MessagingMessageListenerAdapter adapter = getSimpleInstance("echo", Message.class);
358+
MessagingMessageConverter messagingMessageConverter = adapter.getMessagingMessageConverter();
359+
assertThat(messagingMessageConverter).isNotNull();
360+
TextMessage message = new StubTextMessage("Hello");
361+
assertThat(messagingMessageConverter.fromMessage(message)).isInstanceOfSatisfying(Message.class, msg -> {
362+
msg.getPayload(); // force resolution
363+
assertThat(msg.toString()).contains("payload=Hello")
364+
.doesNotContain("rawMessage=").doesNotContain("headers=");
365+
});
366+
}
367+
368+
@Test
369+
void lazyResolutionMessageToStringWithResolvedPayloadAndHeaders() throws JMSException {
370+
MessagingMessageListenerAdapter adapter = getSimpleInstance("echo", Message.class);
371+
MessagingMessageConverter messagingMessageConverter = adapter.getMessagingMessageConverter();
372+
assertThat(messagingMessageConverter).isNotNull();
373+
TextMessage message = new StubTextMessage("Hello");
374+
message.setJMSPriority(7);
375+
assertThat(messagingMessageConverter.fromMessage(message)).isInstanceOfSatisfying(Message.class, msg -> {
376+
msg.getPayload();
377+
msg.getHeaders(); // force resolution
378+
assertThat(msg.toString()).contains("payload=Hello").contains("headers=").contains("jms_priority=7")
379+
.doesNotContain("rawMessage=");
380+
});
381+
}
382+
343383

344384
protected MessagingMessageListenerAdapter getSimpleInstance(String methodName, Class<?>... parameterTypes) {
345385
Method m = ReflectionUtils.findMethod(SampleBean.class, methodName, parameterTypes);

0 commit comments

Comments
 (0)