diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java
index b2d637451d..7c8af1976a 100644
--- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java
+++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParser.java
@@ -28,6 +28,7 @@ import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.xml.AbstractOutboundChannelAdapterParser;
import org.springframework.integration.config.xml.IntegrationNamespaceUtils;
import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
/**
@@ -48,7 +49,22 @@ public class HttpOutboundChannelAdapterParser extends AbstractOutboundChannelAda
builder.addConstructorArgValue(element.getAttribute("url"));
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "http-method");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converters");
- IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "header-mapper");
+ String headerMapper = element.getAttribute("header-mapper");
+ String mappedRequestHeaders = element.getAttribute("mapped-request-headers");
+ if (StringUtils.hasText(headerMapper)) {
+ if (StringUtils.hasText(mappedRequestHeaders)) {
+ parserContext.getReaderContext().error("The 'mappped-request-headers' attribute is not " +
+ "allowed when a 'header-mapper' has been specified.", parserContext.extractSource(element));
+ return null;
+ }
+ builder.addPropertyReference("headerMapper", headerMapper);
+ }
+ else if (StringUtils.hasText(mappedRequestHeaders)) {
+ BeanDefinitionBuilder headerMapperBuilder = BeanDefinitionBuilder.genericBeanDefinition(
+ "org.springframework.integration.http.DefaultHttpHeaderMapper");
+ IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "outboundHeaderNames");
+ builder.addPropertyValue("headerMapper", headerMapperBuilder.getBeanDefinition());
+ }
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "charset");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "expected-response-type");
diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java
index eb6c9ad361..105684dc0c 100644
--- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java
+++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpOutboundGatewayParser.java
@@ -27,6 +27,7 @@ import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.xml.AbstractConsumerEndpointParser;
import org.springframework.integration.config.xml.IntegrationNamespaceUtils;
import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
/**
@@ -51,7 +52,24 @@ public class HttpOutboundGatewayParser extends AbstractConsumerEndpointParser {
builder.addConstructorArgValue(element.getAttribute("url"));
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "http-method");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converters");
- IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "header-mapper");
+ String headerMapper = element.getAttribute("header-mapper");
+ String mappedRequestHeaders = element.getAttribute("mapped-request-headers");
+ String mappedResponseHeaders = element.getAttribute("mapped-response-headers");
+ if (StringUtils.hasText(headerMapper)) {
+ if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) {
+ parserContext.getReaderContext().error("Neither 'mappped-request-headers' or 'mapped-response-headers' " +
+ "attributes are allowed when a 'header-mapper' has been specified.", parserContext.extractSource(element));
+ return null;
+ }
+ builder.addPropertyReference("headerMapper", headerMapper);
+ }
+ else if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) {
+ BeanDefinitionBuilder headerMapperBuilder = BeanDefinitionBuilder.genericBeanDefinition(
+ "org.springframework.integration.http.DefaultHttpHeaderMapper");
+ IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "outboundHeaderNames");
+ IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-response-headers", "inboundHeaderNames");
+ builder.addPropertyValue("headerMapper", headerMapperBuilder.getBeanDefinition());
+ }
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "charset");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-request-payload", "extractPayload");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "expected-response-type");
diff --git a/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd b/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd
index 1cfeea1426..6e4f9cac29 100644
--- a/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd
+++ b/spring-integration-http/src/main/resources/org/springframework/integration/http/config/spring-integration-http-2.0.xsd
@@ -187,6 +187,14 @@
+
+
+
+
+
@@ -259,6 +267,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml
index 12dad0d28e..045930c401 100644
--- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml
+++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests-context.xml
@@ -22,6 +22,7 @@
message-converters="converterList"
extract-payload="false"
expected-response-type="java.lang.Boolean"
+ mapped-request-headers="requestHeader1, requestHeader2"
request-factory="testRequestFactory"
order="77"
auto-startup="false">
diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java
index 8ea03637af..b2dfb1e809 100644
--- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java
+++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundChannelAdapterParserTests.java
@@ -37,6 +37,7 @@ import org.springframework.integration.endpoint.AbstractEndpoint;
import org.springframework.integration.http.HttpRequestExecutingMessageHandler;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.util.ObjectUtils;
/**
* @author Mark Fisher
@@ -101,6 +102,13 @@ public class HttpOutboundChannelAdapterParserTests {
(Map) handlerAccessor.getPropertyValue("uriVariableExpressions");
assertEquals(1, uriVariableExpressions.size());
assertEquals("headers.bar", uriVariableExpressions.get("foo").getExpressionString());
+ DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(handlerAccessor.getPropertyValue("headerMapper"));
+ String[] mappedRequestHeaders = (String[]) mapperAccessor.getPropertyValue("outboundHeaderNames");
+ String[] mappedResponseHeaders = (String[]) mapperAccessor.getPropertyValue("inboundHeaderNames");
+ assertEquals(2, mappedRequestHeaders.length);
+ assertEquals(0, mappedResponseHeaders.length);
+ assertTrue(ObjectUtils.containsElement(mappedRequestHeaders, "requestHeader1"));
+ assertTrue(ObjectUtils.containsElement(mappedRequestHeaders, "requestHeader2"));
}
}
diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml
index 1f75688db9..a36d0c3d90 100644
--- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml
+++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests-context.xml
@@ -29,6 +29,8 @@
message-converters="converterList"
extract-request-payload="false"
expected-response-type="java.lang.String"
+ mapped-request-headers="requestHeader1, requestHeader2"
+ mapped-response-headers="responseHeader"
reply-channel="replies"
charset="UTF-8"
order="77"
diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java
index 43402e57a5..cfaba53b6f 100644
--- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java
+++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpOutboundGatewayParserTests.java
@@ -39,6 +39,7 @@ import org.springframework.integration.endpoint.AbstractEndpoint;
import org.springframework.integration.http.HttpRequestExecutingMessageHandler;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.util.ObjectUtils;
/**
* @author Mark Fisher
@@ -111,6 +112,14 @@ public class HttpOutboundGatewayParserTests {
(Map) handlerAccessor.getPropertyValue("uriVariableExpressions");
assertEquals(1, uriVariableExpressions.size());
assertEquals("headers.bar", uriVariableExpressions.get("foo").getExpressionString());
+ DirectFieldAccessor mapperAccessor = new DirectFieldAccessor(handlerAccessor.getPropertyValue("headerMapper"));
+ String[] mappedRequestHeaders = (String[]) mapperAccessor.getPropertyValue("outboundHeaderNames");
+ String[] mappedResponseHeaders = (String[]) mapperAccessor.getPropertyValue("inboundHeaderNames");
+ assertEquals(2, mappedRequestHeaders.length);
+ assertEquals(1, mappedResponseHeaders.length);
+ assertTrue(ObjectUtils.containsElement(mappedRequestHeaders, "requestHeader1"));
+ assertTrue(ObjectUtils.containsElement(mappedRequestHeaders, "requestHeader2"));
+ assertEquals("responseHeader", mappedResponseHeaders[0]);
}
}