diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java b/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java index d63d69c7b7..e8709bf2a6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/MessageBuilder.java @@ -88,6 +88,7 @@ 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) { + Assert.isTrue(!this.isReadOnly(headerName), "The '" + headerName + "' header is read-only."); if (StringUtils.hasLength(headerName) && !headerName.equals(MessageHeaders.ID) && !headerName.equals(MessageHeaders.TIMESTAMP)) { this.verifyType(headerName, headerValue); @@ -135,7 +136,9 @@ public final class MessageBuilder { public MessageBuilder copyHeaders(Map headersToCopy) { Set keys = headersToCopy.keySet(); for (String key : keys) { - this.setHeader(key, headersToCopy.get(key)); + if (!this.isReadOnly(key)) { + this.setHeader(key, headersToCopy.get(key)); + } } return this; } @@ -146,7 +149,9 @@ public final class MessageBuilder { public MessageBuilder copyHeadersIfAbsent(Map headersToCopy) { Set keys = headersToCopy.keySet(); for (String key : keys) { - this.setHeaderIfAbsent(key, headersToCopy.get(key)); + if (!this.isReadOnly(key)) { + this.setHeaderIfAbsent(key, headersToCopy.get(key)); + } } return this; } @@ -251,6 +256,10 @@ public final class MessageBuilder { return new GenericMessage(this.payload, this.headers); } + private boolean isReadOnly(String headerName) { + return MessageHeaders.ID.equals(headerName) || MessageHeaders.TIMESTAMP.equals(headerName); + } + private void verifyType(String headerName, Object headerValue) { if (headerName != null && headerValue != null) { if (MessageHeaders.ID.equals(headerName)) { diff --git a/spring-integration-core/src/test/java/org/springframework/integration/json/JsonInboundMessageMapperTests.java b/spring-integration-core/src/test/java/org/springframework/integration/json/JsonInboundMessageMapperTests.java index 403f3b6107..33c2fc51c9 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/json/JsonInboundMessageMapperTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/json/JsonInboundMessageMapperTests.java @@ -36,7 +36,6 @@ import org.hamcrest.Factory; import org.hamcrest.Matcher; import org.junit.Test; import org.springframework.integration.Message; -import org.springframework.integration.MessageHeaders; import org.springframework.integration.message.MessageMatcher; import org.springframework.integration.support.MessageBuilder; @@ -59,8 +58,8 @@ public class JsonInboundMessageMapperTests { @Test public void testToMessageWithHeadersAndStringPayload() throws Exception { UUID id = UUID.randomUUID(); - String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\"},\"payload\":\"myPayloadStuff\"}"; - Message expected = MessageBuilder.withPayload("myPayloadStuff").setHeader(MessageHeaders.TIMESTAMP, new Long(1)).setHeader(MessageHeaders.ID, id).build(); + String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\",\"foo\":123,\"bar\":\"abc\"},\"payload\":\"myPayloadStuff\"}"; + Message expected = MessageBuilder.withPayload("myPayloadStuff").setHeader("foo", 123).setHeader("bar", "abc").build(); JsonInboundMessageMapper mapper = new JsonInboundMessageMapper(String.class); Message result = mapper.toMessage(jsonMessage); assertThat(result, sameExceptImmutableHeaders(expected)); @@ -80,8 +79,8 @@ public class JsonInboundMessageMapperTests { public void testToMessageWithHeadersAndBeanPayload() throws Exception { TestBean bean = new TestBean(); UUID id = UUID.randomUUID(); - String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\"},\"payload\":" + getBeanAsJson(bean) + "}"; - Message expected = MessageBuilder.withPayload(bean).setHeader(MessageHeaders.TIMESTAMP, new Long(1)).setHeader(MessageHeaders.ID, id).build(); + String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\",\"foo\":123,\"bar\":\"abc\"},\"payload\":" + getBeanAsJson(bean) + "}"; + Message expected = MessageBuilder.withPayload(bean).setHeader("foo", 123).setHeader("bar", "abc").build(); JsonInboundMessageMapper mapper = new JsonInboundMessageMapper(TestBean.class); Message result = mapper.toMessage(jsonMessage); assertThat(result, sameExceptImmutableHeaders(expected)); @@ -102,8 +101,7 @@ public class JsonInboundMessageMapperTests { TestBean bean = new TestBean(); UUID id = UUID.randomUUID(); String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\", \"myHeader\":" + getBeanAsJson(bean) + "},\"payload\":\"myPayloadStuff\"}"; - Message expected = MessageBuilder.withPayload("myPayloadStuff"). - setHeader(MessageHeaders.TIMESTAMP, new Long(1)).setHeader(MessageHeaders.ID, id).setHeader("myHeader", bean).build(); + Message expected = MessageBuilder.withPayload("myPayloadStuff").setHeader("myHeader", bean).build(); JsonInboundMessageMapper mapper = new JsonInboundMessageMapper(String.class); Map> headerTypes = new HashMap>(); headerTypes.put("myHeader", TestBean.class); @@ -115,9 +113,9 @@ public class JsonInboundMessageMapperTests { @Test public void testToMessageWithHeadersAndListOfStringsPayload() throws Exception { UUID id = UUID.randomUUID(); - String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\"},\"payload\":[\"myPayloadStuff1\",\"myPayloadStuff2\",\"myPayloadStuff3\"]}"; + String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\",\"foo\":123,\"bar\":\"abc\"},\"payload\":[\"myPayloadStuff1\",\"myPayloadStuff2\",\"myPayloadStuff3\"]}"; List expectedList = Arrays.asList(new String[]{"myPayloadStuff1", "myPayloadStuff2", "myPayloadStuff3"}); - Message> expected = MessageBuilder.withPayload(expectedList).setHeader(MessageHeaders.TIMESTAMP, new Long(1)).setHeader(MessageHeaders.ID, id).build(); + Message> expected = MessageBuilder.withPayload(expectedList).setHeader("foo", 123).setHeader("bar", "abc").build(); JsonInboundMessageMapper mapper = new JsonInboundMessageMapper(new TypeReference>(){}); Message result = mapper.toMessage(jsonMessage); assertThat(result, sameExceptImmutableHeaders(expected)); @@ -128,9 +126,9 @@ public class JsonInboundMessageMapperTests { TestBean bean1 = new TestBean(); TestBean bean2 = new TestBean(); UUID id = UUID.randomUUID(); - String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\"},\"payload\":[" + getBeanAsJson(bean1) + "," + getBeanAsJson(bean2) + "]}"; + String jsonMessage = "{\"headers\":{\"timestamp\":1,\"id\":\"" + id + "\",\"foo\":123,\"bar\":\"abc\"},\"payload\":[" + getBeanAsJson(bean1) + "," + getBeanAsJson(bean2) + "]}"; List expectedList = Arrays.asList(new TestBean[]{bean1, bean2}); - Message> expected = MessageBuilder.withPayload(expectedList).setHeader(MessageHeaders.TIMESTAMP, new Long(1)).setHeader(MessageHeaders.ID, id).build(); + Message> expected = MessageBuilder.withPayload(expectedList).setHeader("foo", 123).setHeader("bar", "abc").build(); JsonInboundMessageMapper mapper = new JsonInboundMessageMapper(new TypeReference>(){}); Message result = mapper.toMessage(jsonMessage); assertThat(result, sameExceptImmutableHeaders(expected)); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java index 9a3b492b0c..40b43a440e 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java @@ -69,22 +69,16 @@ public class MessageBuilderTests { assertEquals("2", message2.getHeaders().get("bar")); } - @Test - public void testIdHeaderValues() { + @Test(expected = IllegalArgumentException.class) + public void testIdHeaderValueReadOnly() { UUID id = UUID.randomUUID(); - Message message = MessageBuilder.withPayload("test") - .setHeader(MessageHeaders.ID, id) - .build(); - assertNotSame(id, message.getHeaders().getId()); + MessageBuilder.withPayload("test").setHeader(MessageHeaders.ID, id); } - @Test - public void testTimestampHeaderValues() { + @Test(expected = IllegalArgumentException.class) + public void testTimestampValueReadOnly() { Long timestamp = 12345L; - Message message = MessageBuilder.withPayload("test") - .setHeader(MessageHeaders.TIMESTAMP, timestamp) - .build(); - assertNotSame(timestamp, message.getHeaders().getTimestamp()); + MessageBuilder.withPayload("test").setHeader(MessageHeaders.TIMESTAMP, timestamp).build(); } @Test