From c7286cc9911c2bc99d148b8a6b0cf60f61633174 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 22 Oct 2014 14:14:13 +0300 Subject: [PATCH] INT-3535: Fix `JmsHM` to not override properties JIRA: https://jira.spring.io/browse/INT-3535 Previously when `DefaultJmsHeaderMapper` overrided values, which had been able to be populated by the `MessageConverter`. Since `MessageConverter` result has a precedence which is closer to JMS, skip those custom `MessageHeaders` which already has been populated by `MessageConverter` --- .../jms/DefaultJmsHeaderMapper.java | 4 +- .../jms/DefaultJmsHeaderMapperTests.java | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java index 814eab6009..6eaa243d11 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java @@ -51,6 +51,7 @@ import org.springframework.util.StringUtils; * * @author Mark Fisher * @author Gary Russell + * @author Artem Bilan */ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { @@ -140,7 +141,8 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { } Set headerNames = headers.keySet(); for (String headerName : headerNames) { - if (StringUtils.hasText(headerName) && !headerName.startsWith(JmsHeaders.PREFIX)) { + if (StringUtils.hasText(headerName) && !headerName.startsWith(JmsHeaders.PREFIX) + && jmsMessage.getObjectProperty(headerName) == null) { Object value = headers.get(headerName); if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) { try { diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java index 67793d8fc0..870fa0a5ae 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java @@ -16,24 +16,35 @@ package org.springframework.integration.jms; +import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; import java.util.Date; import java.util.Map; import javax.jms.Destination; import javax.jms.JMSException; +import javax.jms.Session; +import javax.jms.TextMessage; import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import org.springframework.integration.IntegrationMessageHeaderAccessor; import org.springframework.integration.support.MessageBuilder; +import org.springframework.jms.support.converter.MappingJackson2MessageConverter; +import org.springframework.jms.support.converter.MessageType; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + /** * @author Mark Fisher * @author Gary Russell @@ -497,4 +508,41 @@ public class DefaultJmsHeaderMapperTests { assertEquals("bar", headers.get("foo")); } + + @Test + public void testJsonHeaderMapping() throws JMSException { + + MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); + converter.setTargetType(MessageType.TEXT); + converter.setTypeIdPropertyName("javatype"); + + Session session = Mockito.mock(Session.class); + + Mockito.doAnswer(new Answer() { + + @Override + public TextMessage answer(InvocationOnMock invocation) throws Throwable { + return new StubTextMessage((String) invocation.getArguments()[0]); + } + + }).when(session).createTextMessage(Mockito.anyString()); + + javax.jms.Message request = converter.toMessage(new Foo(), session); + + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + Map headers = mapper.toHeaders(request); + + javax.jms.Message reply = converter.toMessage("foo", session); + mapper.fromHeaders(new MessageHeaders(headers), reply); + + Object result = converter.fromMessage(reply); + assertThat(result, instanceOf(String.class)); + } + + + @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "javatype") + private static class Foo { + + } + }