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]); } }