Skip to content

Commit 6d2809d

Browse files
garyrussellartembilan
authored andcommitted
GH-1166: Fix NPE in RepublishMessageRecoverer
Resolves #1166 Occurred when the cause had a `null` message.
1 parent de2282d commit 6d2809d

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/retry/RepublishMessageRecoverer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ private String[] processStackTrace(Throwable cause, String exceptionMessage) {
209209
private String[] truncateIfNecessary(Throwable cause, String exception, String stackTrace) {
210210
boolean truncated = false;
211211
String stackTraceAsString = stackTrace;
212-
String exceptionMessage = exception;
212+
String exceptionMessage = exception == null ? "" : exception;
213213
String truncatedExceptionMessage = exceptionMessage.length() <= MAX_EXCEPTION_MESSAGE_SIZE_IN_TRACE
214214
? exceptionMessage
215215
: (exceptionMessage.substring(0, MAX_EXCEPTION_MESSAGE_SIZE_IN_TRACE) + "...");

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/retry/RepublishMessageRecovererTest.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,28 +54,36 @@ public class RepublishMessageRecovererTest {
5454
private RepublishMessageRecoverer recoverer;
5555

5656
@BeforeEach
57-
public void beforeEach() {
57+
void beforeEach() {
5858
message.getMessageProperties().setReceivedRoutingKey("some.key");
5959
}
6060

6161
@Test
62-
public void shouldPublishWithRoutingKeyPrefixedWithErrorWhenExchangeIsNotSet() {
62+
void shouldPublishWithRoutingKeyPrefixedWithErrorWhenExchangeIsNotSet() {
6363
recoverer = new RepublishMessageRecoverer(amqpTemplate);
6464
recoverer.recover(message, cause);
6565

6666
verify(amqpTemplate).send("error.some.key", message);
6767
}
6868

6969
@Test
70-
public void shouldPublishWithSetErrorRoutingKeyWhenExchangeAndErrorRoutingKeyProvided() {
70+
void nullCauseMessage() {
71+
recoverer = new RepublishMessageRecoverer(amqpTemplate);
72+
recoverer.recover(message, new RuntimeException(new RuntimeException()));
73+
74+
verify(amqpTemplate).send("error.some.key", message);
75+
}
76+
77+
@Test
78+
void shouldPublishWithSetErrorRoutingKeyWhenExchangeAndErrorRoutingKeyProvided() {
7179
recoverer = new RepublishMessageRecoverer(amqpTemplate, "errorExchange", "errorRoutingKey");
7280
recoverer.recover(message, cause);
7381

7482
verify(amqpTemplate).send("errorExchange", "errorRoutingKey", message);
7583
}
7684

7785
@Test
78-
public void shouldPublishToProvidedExchange() {
86+
void shouldPublishToProvidedExchange() {
7987
recoverer = new RepublishMessageRecoverer(amqpTemplate, "error");
8088

8189
recoverer.recover(message, cause);
@@ -84,7 +92,7 @@ public void shouldPublishToProvidedExchange() {
8492
}
8593

8694
@Test
87-
public void shouldIncludeTheStacktraceInTheHeaderOfThePublishedMessage() {
95+
void shouldIncludeTheStacktraceInTheHeaderOfThePublishedMessage() {
8896
recoverer = new RepublishMessageRecoverer(amqpTemplate);
8997
ByteArrayOutputStream baos = new ByteArrayOutputStream();
9098
cause.printStackTrace(new PrintStream(baos));
@@ -96,15 +104,15 @@ public void shouldIncludeTheStacktraceInTheHeaderOfThePublishedMessage() {
96104
}
97105

98106
@Test
99-
public void shouldIncludeTheCauseMessageInTheHeaderOfThePublishedMessage() {
107+
void shouldIncludeTheCauseMessageInTheHeaderOfThePublishedMessage() {
100108
recoverer = new RepublishMessageRecoverer(amqpTemplate);
101109
recoverer.recover(message, cause);
102110

103111
assertThat(message.getMessageProperties().getHeaders().get("x-exception-message")).isEqualTo(cause.getCause().getMessage());
104112
}
105113

106114
@Test
107-
public void shouldSetTheOriginalMessageExchangeOnInTheHeaders() {
115+
void shouldSetTheOriginalMessageExchangeOnInTheHeaders() {
108116
message.getMessageProperties().setReceivedExchange("the.original.exchange");
109117
recoverer = new RepublishMessageRecoverer(amqpTemplate, "error");
110118

@@ -114,7 +122,7 @@ public void shouldSetTheOriginalMessageExchangeOnInTheHeaders() {
114122
}
115123

116124
@Test
117-
public void shouldRemapDeliveryMode() {
125+
void shouldRemapDeliveryMode() {
118126
message.getMessageProperties().setDeliveryMode(null);
119127
message.getMessageProperties().setReceivedDeliveryMode(MessageDeliveryMode.PERSISTENT);
120128
recoverer = new RepublishMessageRecoverer(amqpTemplate, "error") {
@@ -133,7 +141,7 @@ public void shouldRemapDeliveryMode() {
133141
}
134142

135143
@Test
136-
public void setDeliveryModeIfNull() {
144+
void setDeliveryModeIfNull() {
137145
this.message.getMessageProperties().setDeliveryMode(null);
138146
this.recoverer = new RepublishMessageRecoverer(amqpTemplate, "error");
139147

0 commit comments

Comments
 (0)