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:
committed by
Gary Russell
parent
4b3836fa09
commit
c7286cc991
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user