diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderEnricherParserSupport.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderEnricherParserSupport.java
index d84acdfaa4..5e6205f9e3 100644
--- a/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderEnricherParserSupport.java
+++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/xml/HeaderEnricherParserSupport.java
@@ -85,24 +85,27 @@ public abstract class HeaderEnricherParserSupport extends AbstractTransformerPar
Class> headerType = null;
if ("header".equals(elementName)) {
headerName = headerElement.getAttribute("name");
- String headerTypeName = headerElement.getAttribute("type");
- if (StringUtils.hasText(headerTypeName)) {
- ClassLoader classLoader = parserContext.getReaderContext().getBeanClassLoader();
- if (classLoader != null) {
- try {
- headerType = ClassUtils.forName(headerTypeName, classLoader);
- }
- catch (Exception e) {
- parserContext.getReaderContext().error("unable to resolve type [" +
- headerTypeName + "] for header '" + headerName + "'", element, e);
- }
- }
- }
}
else {
headerName = elementToNameMap.get(elementName);
headerType = elementToTypeMap.get(elementName);
}
+ if (headerType == null) {
+ String headerTypeName = headerElement.getAttribute("type");
+ if (StringUtils.hasText(headerTypeName)) {
+ ClassLoader classLoader = parserContext.getReaderContext().getBeanClassLoader();
+ if (classLoader == null) {
+ classLoader = getClass().getClassLoader();
+ }
+ try {
+ headerType = ClassUtils.forName(headerTypeName, classLoader);
+ }
+ catch (Exception e) {
+ parserContext.getReaderContext().error("unable to resolve type [" +
+ headerTypeName + "] for header '" + headerName + "'", element, e);
+ }
+ }
+ }
if (headerName != null) {
String value = headerElement.getAttribute("value");
String ref = headerElement.getAttribute("ref");
diff --git a/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd b/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd
index 991fc709bd..727e593a83 100644
--- a/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd
+++ b/org.springframework.integration/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.0.xsd
@@ -937,6 +937,14 @@
+
+
+ Provides a header value for the given header name. Requires
+ exactly one of the 'ref', 'value', or 'expression' attributes.
+ The 'type' attribute allows for the specification of the expected
+ type when using a 'value' or 'expression', but it is optional.
+
+
@@ -954,6 +962,13 @@
+
+
+
+
+
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests-context.xml b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests-context.xml
index 0be000d44b..9553385091 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests-context.xml
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests-context.xml
@@ -38,6 +38,10 @@
+
+
+
+
@@ -70,4 +74,12 @@
+
+
+
+
+
+
+
+
diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests.java
index e5633bed5f..72745c3fbf 100644
--- a/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests.java
+++ b/org.springframework.integration/src/test/java/org/springframework/integration/config/xml/HeaderEnricherTests.java
@@ -18,6 +18,9 @@ package org.springframework.integration.config.xml;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -80,6 +83,17 @@ public class HeaderEnricherTests {
assertEquals("ABC", result.getHeaders().getCorrelationId());
}
+ @Test
+ public void correlationIdValueWithType() {
+ SimpleMessagingGateway gateway = new SimpleMessagingGateway();
+ gateway.setRequestChannel(context.getBean("correlationIdValueWithTypeInput", MessageChannel.class));
+ Message> result = gateway.sendAndReceiveMessage("test");
+ assertNotNull(result);
+ Object correlationId = result.getHeaders().getCorrelationId();
+ assertEquals(Long.class, correlationId.getClass());
+ assertEquals(new Long(123), correlationId);
+ }
+
@Test
public void correlationIdRef() {
SimpleMessagingGateway gateway = new SimpleMessagingGateway();
@@ -135,6 +149,28 @@ public class HeaderEnricherTests {
assertEquals("foobar", result.getHeaders().get("testHeader2"));
}
+ @Test
+ public void expressionWithDateType() {
+ SimpleMessagingGateway gateway = new SimpleMessagingGateway();
+ gateway.setRequestChannel(context.getBean("expressionWithDateTypeInput", MessageChannel.class));
+ Message> result = gateway.sendAndReceiveMessage("test");
+ assertNotNull(result);
+ Object headerValue = result.getHeaders().get("currentDate");
+ assertEquals(Date.class, headerValue.getClass());
+ Date date = (Date) headerValue;
+ assertTrue(new Date().getTime() - date.getTime() < 1000);
+ }
+
+ @Test
+ public void expressionWithLongType() {
+ SimpleMessagingGateway gateway = new SimpleMessagingGateway();
+ gateway.setRequestChannel(context.getBean("expressionWithLongTypeInput", MessageChannel.class));
+ Message> result = gateway.sendAndReceiveMessage("test");
+ assertNotNull(result);
+ assertEquals(Long.class, result.getHeaders().get("number").getClass());
+ assertEquals(new Long(12345), result.getHeaders().get("number"));
+ }
+
public static class TestBean {