diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/message/MessageBuilder.java b/org.springframework.integration/src/main/java/org/springframework/integration/message/MessageBuilder.java index e419d25f83..075c504015 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/message/MessageBuilder.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/message/MessageBuilder.java @@ -35,8 +35,7 @@ public final class MessageBuilder { /** - * Create a new {@link Message} instance with no header values using - * the provided payload instance. + * Private constructor to be invoked from the static factory methods only. */ private MessageBuilder(T payload) { Assert.notNull(payload, "payload must not be null"); @@ -49,7 +48,8 @@ public final class MessageBuilder { * all of the headers copied from the provided message. The payload will * also be taken from the provided message. * - * @param messageToCopy the Message from which all headers should be copied + * @param messageToCopy the Message from which the paylaod and all headers + * will be copied */ public static MessageBuilder fromMessage(Message message) { MessageBuilder builder = new MessageBuilder(message.getPayload()); @@ -58,8 +58,7 @@ public final class MessageBuilder { } /** - * Create a builder for a new {@link Message} instance with no header - * values using the provided payload instance. + * Create a builder for a new {@link Message} instance with the provided payload. * * @param payload the payload for the new message */ @@ -69,18 +68,42 @@ public final class MessageBuilder { } + /** + * Set the value for the given header name. If the provided value is + * null, the header will be removed. + */ public MessageBuilder setHeader(String headerName, Object headerValue) { - this.headers.put(headerName, headerValue); - return this; - } - - public MessageBuilder setHeaderIfAbsent(String headerName, Object headerValue) { - if (this.headers.get(headerName) == null) { - this.headers.put(headerName, headerValue); + if (headerName != null) { + if (headerValue == null) { + this.headers.remove(headerName); + } + else { + this.headers.put(headerName, headerValue); + } } return this; } + /** + * Set the value for the given header name only if the header name + * is not already associated with a value. + */ + public MessageBuilder setHeaderIfAbsent(String headerName, Object headerValue) { + if (this.headers.get(headerName) == null) { + this.setHeader(headerName, headerValue); + } + return this; + } + + /** + * Copy the name-value pairs from the provided Map. This operation will + * overwrite any existing values. Use {{@link #copyHeadersIfAbsent(Map)} + * to avoid overwriting values. Note that the 'id' and 'timestamp' header + * values will never be overwritten. + * + * @see MessageHeaders#ID + * @see MessageHeaders#TIMESTAMP + */ public MessageBuilder copyHeaders(Map headersToCopy) { Set keys = headersToCopy.keySet(); for (String key : keys) { @@ -91,6 +114,10 @@ public final class MessageBuilder { return this; } + /** + * Copy the name-value pairs from the provided Map. This operation will + * not overwrite any existing values. + */ public MessageBuilder copyHeadersIfAbsent(Map headersToCopy) { Set keys = headersToCopy.keySet(); for (String key : keys) {