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 0827000087..a70c64e5ec 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
@@ -58,6 +58,36 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
private final Log logger = LogFactory.getLog(this.getClass());
+ private volatile String inboundPrefix = "";
+
+ private volatile String outboundPrefix = "";
+
+
+ /**
+ * Specify a prefix to be appended to the integration message header name
+ * for any JMS property that is being mapped into the MessageHeaders.
+ * The Default is an empty string (no prefix).
+ *
+ * This does not affect the JMS properties covered by the specification/API,
+ * such as JMSCorrelationID, etc. The header names used for mapping such
+ * properties are all defined in our {@link JmsHeaders}.
+ */
+ public void setInboundPrefix(String inboundPrefix) {
+ this.inboundPrefix = (inboundPrefix != null) ? inboundPrefix : "";
+ }
+
+ /**
+ * Specify a prefix to be appended to the JMS property name for any
+ * integration message header that is being mapped into the JMS Message.
+ * The Default is an empty string (no prefix).
+ *
+ * This does not affect the JMS properties covered by the specification/API,
+ * such as JMSCorrelationID, etc. The header names used for mapping such
+ * properties are all defined in our {@link JmsHeaders}.
+ */
+ public void setOutboundPrefix(String outboundPrefix) {
+ this.outboundPrefix = (outboundPrefix != null) ? outboundPrefix : "";
+ }
public void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) {
try {
@@ -91,26 +121,23 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
logger.info("failed to set JMSType, skipping", e);
}
}
- Set attributeNames = headers.keySet();
- for (String attributeName : attributeNames) {
- if (!attributeName.startsWith(JmsHeaders.PREFIX)) {
- if (StringUtils.hasText(attributeName)) {
- Object value = headers.get(attributeName);
- if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) {
- try {
- jmsMessage.setObjectProperty(attributeName, value);
+ Set headerNames = headers.keySet();
+ for (String headerName : headerNames) {
+ if (StringUtils.hasText(headerName) && !headerName.startsWith(JmsHeaders.PREFIX)) {
+ Object value = headers.get(headerName);
+ if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) {
+ try {
+ String propertyName = this.fromHeaderName(headerName);
+ jmsMessage.setObjectProperty(propertyName, value);
+ }
+ catch (Exception e) {
+ if (headerName.startsWith("JMSX")) {
+ if (logger.isTraceEnabled()) {
+ logger.trace("skipping reserved header, it cannot be set by client: " + headerName);
+ }
}
- catch (Exception e) {
- if (attributeName.startsWith("JMSX")) {
- if (logger.isTraceEnabled()) {
- logger.trace("skipping reserved header, it cannot be set by client: "
- + attributeName);
- }
- }
- else if (logger.isWarnEnabled()) {
- logger.warn("failed to map Message header '"
- + attributeName + "' to JMS property", e);
- }
+ else if (logger.isWarnEnabled()) {
+ logger.warn("failed to map Message header '" + headerName + "' to JMS property", e);
}
}
}
@@ -174,7 +201,8 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
while (jmsPropertyNames.hasMoreElements()) {
String propertyName = jmsPropertyNames.nextElement().toString();
try {
- headers.put(propertyName, jmsMessage.getObjectProperty(propertyName));
+ String headerName = this.toHeaderName(propertyName);
+ headers.put(headerName, jmsMessage.getObjectProperty(propertyName));
}
catch (Exception e) {
if (logger.isWarnEnabled()) {
@@ -193,4 +221,26 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
return headers;
}
+ /**
+ * Adds the outbound prefix if necessary.
+ */
+ private String fromHeaderName(String headerName) {
+ String propertyName = headerName;
+ if (StringUtils.hasText(this.outboundPrefix) && !propertyName.startsWith(this.outboundPrefix)) {
+ propertyName = this.outboundPrefix + headerName;
+ }
+ return propertyName;
+ }
+
+ /**
+ * Adds the inbound prefix if necessary.
+ */
+ private String toHeaderName(String propertyName) {
+ String headerName = propertyName;
+ if (StringUtils.hasText(this.inboundPrefix) && !headerName.startsWith(this.inboundPrefix)) {
+ headerName = this.inboundPrefix + propertyName;
+ }
+ return headerName;
+ }
+
}
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 38ef34420e..b86c114fb1 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
@@ -129,6 +129,21 @@ public class DefaultJmsHeaderMapperTests {
assertEquals(123, ((Integer) value).intValue());
}
+ @Test
+ public void testUserDefinedPropertyMappedFromHeaderWithCustomPrefix() throws JMSException {
+ Message message = MessageBuilder.withPayload("test")
+ .setHeader("foo", new Integer(123))
+ .build();
+ DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
+ mapper.setOutboundPrefix("custom_");
+ javax.jms.Message jmsMessage = new StubTextMessage();
+ mapper.fromHeaders(message.getHeaders(), jmsMessage);
+ Object value = jmsMessage.getObjectProperty("custom_foo");
+ assertNotNull(value);
+ assertEquals(Integer.class, value.getClass());
+ assertEquals(123, ((Integer) value).intValue());
+ }
+
@Test
public void testUserDefinedPropertyWithUnsupportedType() throws JMSException {
Destination destination = new Destination() {};
@@ -202,6 +217,19 @@ public class DefaultJmsHeaderMapperTests {
assertEquals(123, ((Integer) attrib).intValue());
}
+ @Test
+ public void testUserDefinedPropertyMappedToHeaderWithCustomPrefix() throws JMSException {
+ javax.jms.Message jmsMessage = new StubTextMessage();
+ jmsMessage.setIntProperty("foo", 123);
+ DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
+ mapper.setInboundPrefix("custom_");
+ Map headers = mapper.toHeaders(jmsMessage);
+ Object header = headers.get("custom_foo");
+ assertNotNull(header);
+ assertEquals(Integer.class, header.getClass());
+ assertEquals(123, ((Integer) header).intValue());
+ }
+
@Test
public void testPropertyMappingExceptionIsNotFatal() throws JMSException {
Message message = MessageBuilder.withPayload("test")