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 { + + } + }