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>
This commit is contained in:
Mengqi Xu 2025-05-26 23:44:05 +08:00 committed by Sam Brannen
parent aea66265f7
commit bbf61c74ab
2 changed files with 19 additions and 1 deletions

View File

@ -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");

View File

@ -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));
}
}