From bbf61c74ab889788492e5b24acdd20042705fcd3 Mon Sep 17 00:00:00 2001 From: Mengqi Xu <2663479778@qq.com> Date: Mon, 26 May 2025 23:44:05 +0800 Subject: [PATCH 1/2] Fix REPLY_CHANNEL header check in MessageHeaderAccessor Prior to this commit, the verifyType() method in MessageHeaderAccessor checked if REPLY_CHANNEL ended with the given header name which does not make much sense and is inconsistent with the ERROR_CHANNEL check. This commit therefore checks if the REPLY_CHANNEL is equal to the given header name, analogous to the ERROR_CHANNEL check. See gh-34881 Closes gh-34949 Signed-off-by: Mengqi Xu <2663479778@qq.com> --- .../support/MessageHeaderAccessor.java | 2 +- .../messaging/support/MessageBuilderTests.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java index ab39f57211..c9e180ac7b 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java @@ -332,7 +332,7 @@ public class MessageHeaderAccessor { protected void verifyType(@Nullable String headerName, @Nullable Object headerValue) { if (headerName != null && headerValue != null) { if (MessageHeaders.ERROR_CHANNEL.equals(headerName) || - MessageHeaders.REPLY_CHANNEL.endsWith(headerName)) { + MessageHeaders.REPLY_CHANNEL.equals(headerName)) { if (!(headerValue instanceof MessageChannel || headerValue instanceof String)) { throw new IllegalArgumentException( "'" + headerName + "' header value must be a MessageChannel or String"); diff --git a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java index 42aae2a371..5714a587a9 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java @@ -34,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; /** * @author Mark Fisher * @author Rossen Stoyanchev + * @author Mengqi Xu */ class MessageBuilderTests { @@ -238,4 +239,21 @@ class MessageBuilderTests { assertThat(message3.getHeaders().get("foo")).isEqualTo("bar3"); } + @Test + void buildReplyChannelHeaderMessage() { + MessageHeaderAccessor headerAccessor = new MessageHeaderAccessor(); + MessageBuilder messageBuilder = MessageBuilder.withPayload("payload").setHeaders(headerAccessor); + + headerAccessor.setHeader("replyChannel", "foo"); + Message message1 = messageBuilder.build(); + + headerAccessor.setHeader("hannel", 0); + Message message2 = messageBuilder.build(); + + assertThat(message1.getHeaders().get("replyChannel")).isEqualTo("foo"); + assertThat(message2.getHeaders().get("hannel")).isEqualTo(0); + + assertThatIllegalArgumentException().isThrownBy(() -> headerAccessor.setHeader("replyChannel", 0)); + } + } From f207c0ed5cb82f71366050906714fca272712c6a Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Mon, 2 Jun 2025 10:10:46 +0200 Subject: [PATCH 2/2] Polish contribution See gh-34949 --- .../messaging/support/MessageHeaderAccessor.java | 2 +- .../messaging/support/MessageBuilderTests.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java index c9e180ac7b..b4ba9b120b 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java index 5714a587a9..cc4078c35b 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -239,21 +239,22 @@ class MessageBuilderTests { assertThat(message3.getHeaders().get("foo")).isEqualTo("bar3"); } - @Test - void buildReplyChannelHeaderMessage() { + @Test // gh-34949 + void buildMessageWithReplyChannelHeader() { MessageHeaderAccessor headerAccessor = new MessageHeaderAccessor(); MessageBuilder messageBuilder = MessageBuilder.withPayload("payload").setHeaders(headerAccessor); - headerAccessor.setHeader("replyChannel", "foo"); + headerAccessor.setHeader(MessageHeaders.REPLY_CHANNEL, "foo"); Message message1 = messageBuilder.build(); + assertThat(message1.getHeaders().get(MessageHeaders.REPLY_CHANNEL)).isEqualTo("foo"); headerAccessor.setHeader("hannel", 0); Message message2 = messageBuilder.build(); - - assertThat(message1.getHeaders().get("replyChannel")).isEqualTo("foo"); assertThat(message2.getHeaders().get("hannel")).isEqualTo(0); - assertThatIllegalArgumentException().isThrownBy(() -> headerAccessor.setHeader("replyChannel", 0)); + assertThatIllegalArgumentException() + .isThrownBy(() -> headerAccessor.setHeader(MessageHeaders.REPLY_CHANNEL, 0)) + .withMessage("'%s' header value must be a MessageChannel or String", MessageHeaders.REPLY_CHANNEL); } }