Skip to content

Commit 078dfd4

Browse files
committed
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
1 parent d89cb34 commit 078dfd4

File tree

2 files changed

+75
-2
lines changed

2 files changed

+75
-2
lines changed

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,20 +123,43 @@ public class MessageHeaderAccessor {
123123
@Nullable
124124
private IdGenerator idGenerator;
125125

126+
private MessageHeaderAccessor(@Nullable MessageHeaders headers) {
127+
this.headers = new MutableMessageHeaders(headers);
128+
}
129+
126130

127131
/**
128132
* A constructor to create new headers.
129133
*/
130134
public MessageHeaderAccessor() {
131-
this(null);
135+
this((MessageHeaders) null);
132136
}
133137

134138
/**
135139
* A constructor accepting the headers of an existing message to copy.
136140
* @param message a message to copy the headers from, or {@code null} if none
137141
*/
138142
public MessageHeaderAccessor(@Nullable Message<?> message) {
139-
this.headers = new MutableMessageHeaders(message != null ? message.getHeaders() : null);
143+
this(message != null ? message.getHeaders() : null);
144+
}
145+
146+
147+
/**
148+
* Create an instance from a plain {@link Map}.
149+
* @param map the raw headers
150+
* @since 6.2
151+
*/
152+
public static MessageHeaderAccessor fromMap(@Nullable Map<String, Object> map) {
153+
return fromMessageHeaders(new MessageHeaders(map));
154+
}
155+
156+
/**
157+
* Create an instance from an existing {@link MessageHeaders} instance.
158+
* @param headers the headers
159+
* @since 6.2
160+
*/
161+
public static MessageHeaderAccessor fromMessageHeaders(@Nullable MessageHeaders headers) {
162+
return new MessageHeaderAccessor(headers);
140163
}
141164

142165

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,30 @@ void newEmptyHeaders() {
4747
assertThat(accessor.toMap()).isEmpty();
4848
}
4949

50+
@Test
51+
void fromEmptyMap() {
52+
MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMap(Collections.emptyMap());
53+
assertThat(accessor.toMap()).isEmpty();
54+
}
55+
56+
@Test
57+
void fromNullMap() {
58+
MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMap(null);
59+
assertThat(accessor.toMap()).isEmpty();
60+
}
61+
62+
@Test
63+
void fromEmptyMessageHeaders() {
64+
MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMessageHeaders(new MessageHeaders(Collections.emptyMap()));
65+
assertThat(accessor.toMap()).isEmpty();
66+
}
67+
68+
@Test
69+
void fromNullMessageHeaders() {
70+
MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMessageHeaders(null);
71+
assertThat(accessor.toMap()).isEmpty();
72+
}
73+
5074
@Test
5175
void existingHeaders() {
5276
Map<String, Object> map = new HashMap<>();
@@ -62,6 +86,32 @@ void existingHeaders() {
6286
assertThat(actual.get("bar")).isEqualTo("baz");
6387
}
6488

89+
@Test
90+
void fromMapWithExistingHeaders() {
91+
Map<String, Object> map = new HashMap<>();
92+
map.put("foo", "bar");
93+
map.put("bar", "baz");
94+
MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMap(map);
95+
MessageHeaders actual = accessor.getMessageHeaders();
96+
97+
assertThat(actual).hasSize(3);
98+
assertThat(actual.get("foo")).isEqualTo("bar");
99+
assertThat(actual.get("bar")).isEqualTo("baz");
100+
}
101+
102+
@Test
103+
void fromMessageHeaderWithExistingHeaders() {
104+
Map<String, Object> map = new HashMap<>();
105+
map.put("foo", "bar");
106+
map.put("bar", "baz");
107+
MessageHeaderAccessor accessor = MessageHeaderAccessor.fromMessageHeaders(new MessageHeaders(map));
108+
MessageHeaders actual = accessor.getMessageHeaders();
109+
110+
assertThat(actual).hasSize(3);
111+
assertThat(actual.get("foo")).isEqualTo("bar");
112+
assertThat(actual.get("bar")).isEqualTo("baz");
113+
}
114+
65115
@Test
66116
void existingHeadersModification() throws InterruptedException {
67117
Map<String, Object> map = new HashMap<>();

0 commit comments

Comments
 (0)