Skip to content

Commit a37abd5

Browse files
committed
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
1 parent 18456de commit a37abd5

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

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

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 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.
@@ -550,6 +550,29 @@ public MessageHeaders getHeaders() {
550550
}
551551
return this.headers;
552552
}
553+
554+
@Override
555+
public String toString() {
556+
StringBuilder sb = new StringBuilder(getClass().getSimpleName());
557+
if (this.payload == null) {
558+
sb.append(" [rawMessage=").append(this.message);
559+
}
560+
else {
561+
sb.append(" [payload=");
562+
if (this.payload instanceof byte[] bytes) {
563+
sb.append("byte[").append(bytes.length).append(']');
564+
}
565+
else {
566+
sb.append(this.payload);
567+
}
568+
}
569+
if (this.headers != null) {
570+
sb.append(", headers=").append(this.headers);
571+
}
572+
sb.append(']');
573+
return sb.toString();
574+
}
575+
553576
}
554577
}
555578

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

+40
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
4040
import org.springframework.jms.support.converter.MessageConverter;
4141
import org.springframework.jms.support.converter.MessageType;
42+
import org.springframework.jms.support.converter.MessagingMessageConverter;
4243
import org.springframework.messaging.Message;
4344
import org.springframework.messaging.converter.MessageConversionException;
4445
import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
@@ -339,6 +340,45 @@ public TextMessage testReplyWithJackson(String methodName, String replyContent)
339340
return responseMessage;
340341
}
341342

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

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

0 commit comments

Comments
 (0)