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 d452456acab..ab39f57211b 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 @@ -123,12 +123,16 @@ public class MessageHeaderAccessor { @Nullable private IdGenerator idGenerator; + private MessageHeaderAccessor(@Nullable MessageHeaders headers) { + this.headers = new MutableMessageHeaders(headers); + } + /** * A constructor to create new headers. */ public MessageHeaderAccessor() { - this(null); + this((MessageHeaders) null); } /** @@ -136,7 +140,26 @@ public class MessageHeaderAccessor { * @param message a message to copy the headers from, or {@code null} if none */ public MessageHeaderAccessor(@Nullable Message message) { - this.headers = new MutableMessageHeaders(message != null ? message.getHeaders() : null); + this(message != null ? message.getHeaders() : null); + } + + + /** + * Create an instance from a plain {@link Map}. + * @param map the raw headers + * @since 6.2 + */ + public static MessageHeaderAccessor fromMap(@Nullable Map map) { + return fromMessageHeaders(new MessageHeaders(map)); + } + + /** + * Create an instance from an existing {@link MessageHeaders} instance. + * @param headers the headers + * @since 6.2 + */ + public static MessageHeaderAccessor fromMessageHeaders(@Nullable MessageHeaders headers) { + return new MessageHeaderAccessor(headers); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java index afe8edea4c8..370eff28676 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java @@ -47,6 +47,30 @@ class MessageHeaderAccessorTests { assertThat(accessor.toMap()).isEmpty(); } + @Test + void fromEmptyMap() { + MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMap(Collections.emptyMap()); + assertThat(accessor.toMap()).isEmpty(); + } + + @Test + void fromNullMap() { + MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMap(null); + assertThat(accessor.toMap()).isEmpty(); + } + + @Test + void fromEmptyMessageHeaders() { + MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMessageHeaders(new MessageHeaders(Collections.emptyMap())); + assertThat(accessor.toMap()).isEmpty(); + } + + @Test + void fromNullMessageHeaders() { + MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMessageHeaders(null); + assertThat(accessor.toMap()).isEmpty(); + } + @Test void existingHeaders() { Map map = new HashMap<>(); @@ -62,6 +86,32 @@ class MessageHeaderAccessorTests { assertThat(actual.get("bar")).isEqualTo("baz"); } + @Test + void fromMapWithExistingHeaders() { + Map map = new HashMap<>(); + map.put("foo", "bar"); + map.put("bar", "baz"); + MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMap(map); + MessageHeaders actual = accessor.getMessageHeaders(); + + assertThat(actual).hasSize(3); + assertThat(actual.get("foo")).isEqualTo("bar"); + assertThat(actual.get("bar")).isEqualTo("baz"); + } + + @Test + void fromMessageHeaderWithExistingHeaders() { + Map map = new HashMap<>(); + map.put("foo", "bar"); + map.put("bar", "baz"); + MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMessageHeaders(new MessageHeaders(map)); + MessageHeaders actual = accessor.getMessageHeaders(); + + assertThat(actual).hasSize(3); + assertThat(actual.get("foo")).isEqualTo("bar"); + assertThat(actual.get("bar")).isEqualTo("baz"); + } + @Test void existingHeadersModification() throws InterruptedException { Map map = new HashMap<>();