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`
This commit is contained in:
Artem Bilan
2014-10-22 14:14:13 +03:00
committed by Gary Russell
parent 4b3836fa09
commit c7286cc991
2 changed files with 51 additions and 1 deletions

View File

@@ -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<String> 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 {

View File

@@ -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<TextMessage>() {
@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<String, Object> 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 {
}
}