Browse Source

Add MessageHeaderAccessor to be created with existing headers

This commit mirrors toMap/toMessageHeaders with from factory methods
that allow to create an instance without having to create an
intermediate message if all they have is the headers.

Closes gh-33153
pull/33165/head
Stéphane Nicoll 2 years ago
parent
commit
078dfd47dc
  1. 27
      spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java
  2. 50
      spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java

27
spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java

@ -123,12 +123,16 @@ public class MessageHeaderAccessor { @@ -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 { @@ -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<String, Object> 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);
}

50
spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java

@ -47,6 +47,30 @@ class MessageHeaderAccessorTests { @@ -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<String, Object> map = new HashMap<>();
@ -62,6 +86,32 @@ class MessageHeaderAccessorTests { @@ -62,6 +86,32 @@ class MessageHeaderAccessorTests {
assertThat(actual.get("bar")).isEqualTo("baz");
}
@Test
void fromMapWithExistingHeaders() {
Map<String, Object> 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<String, Object> 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<String, Object> map = new HashMap<>();

Loading…
Cancel
Save