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 484ab28f96792ea64ab13850d2f36fef2c094d0d..976c207b4132b73d052e4ac790419f17a9036be3 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 @@ -306,12 +306,17 @@ public class MessageHeaderAccessor { throw new IllegalArgumentException("'" + name + "' header is read-only"); } verifyType(name, value); - if (!ObjectUtils.nullSafeEquals(value, getHeader(name))) { - this.modified = true; - if (value != null) { + if (value != null) { + // Modify header if necessary + if (!ObjectUtils.nullSafeEquals(value, getHeader(name))) { + this.modified = true; this.headers.getRawHeaders().put(name, value); } - else { + } + else { + // Remove header if available + if (this.headers.containsKey(name)) { + this.modified = true; this.headers.getRawHeaders().remove(name); } } 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 a09429fb62bd6ca655b5d82232a1949879a41c2d..7d350e8e7a379241d5cc102870e54ca79c0509b3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.springframework.messaging.support; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -40,6 +41,7 @@ import static org.junit.Assert.*; * * @author Rossen Stoyanchev * @author Sebastien Deleuze + * @author Juergen Hoeller */ public class MessageHeaderAccessorTests { @@ -89,6 +91,24 @@ public class MessageHeaderAccessorTests { assertEquals("baz", actual.get("bar")); } + @Test + public void testRemoveHeader() { + Message message = new GenericMessage<>("payload", Collections.singletonMap("foo", "bar")); + MessageHeaderAccessor accessor = new MessageHeaderAccessor(message); + accessor.removeHeader("foo"); + Map headers = accessor.toMap(); + assertFalse(headers.containsKey("foo")); + } + + @Test + public void testRemoveHeaderEvenIfNull() { + Message message = new GenericMessage<>("payload", Collections.singletonMap("foo", null)); + MessageHeaderAccessor accessor = new MessageHeaderAccessor(message); + accessor.removeHeader("foo"); + Map headers = accessor.toMap(); + assertFalse(headers.containsKey("foo")); + } + @Test public void removeHeaders() { Map map = new HashMap<>(); @@ -153,7 +173,6 @@ public class MessageHeaderAccessorTests { @Test public void toMap() { - MessageHeaderAccessor accessor = new MessageHeaderAccessor(); accessor.setHeader("foo", "bar1"); @@ -380,7 +399,6 @@ public class MessageHeaderAccessorTests { } - public static class TestMessageHeaderAccessor extends MessageHeaderAccessor { private TestMessageHeaderAccessor() {