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 {