diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java index 1bfa088199..ecc4763523 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/HttpInboundEndpointParser.java @@ -98,6 +98,8 @@ public class HttpInboundEndpointParser extends AbstractSingleBeanDefinitionParse 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' " + @@ -105,9 +107,11 @@ public class HttpInboundEndpointParser extends AbstractSingleBeanDefinitionParse } builder.addPropertyReference("headerMapper", headerMapper); } - else if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) { + else { BeanDefinitionBuilder headerMapperBuilder = BeanDefinitionBuilder.genericBeanDefinition( - "org.springframework.integration.http.support.DefaultHttpHeaderMapper"); + "org.springframework.integration.http.support.DefaultHttpHeaderMapper"); + headerMapperBuilder.setFactoryMethod("inboundMapper"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "inboundHeaderNames"); IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-response-headers", "outboundHeaderNames"); builder.addPropertyValue("headerMapper", headerMapperBuilder.getBeanDefinition()); 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 8b53cf1ed0..562a3a6e0c 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 @@ -72,7 +72,9 @@ public class HttpOutboundChannelAdapterParser extends AbstractOutboundChannelAda else if (StringUtils.hasText(mappedRequestHeaders)) { BeanDefinitionBuilder headerMapperBuilder = BeanDefinitionBuilder.genericBeanDefinition( "org.springframework.integration.http.support.DefaultHttpHeaderMapper"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "outboundHeaderNames"); + if (StringUtils.hasText(mappedRequestHeaders)) { + IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "outboundHeaderNames"); + } builder.addPropertyValue("headerMapper", headerMapperBuilder.getBeanDefinition()); } IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "charset"); 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 89fad03af0..3d98ff9f82 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 @@ -71,9 +71,10 @@ public class HttpOutboundGatewayParser extends AbstractConsumerEndpointParser { } builder.addPropertyReference("headerMapper", headerMapper); } - else if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) { + else {//if (StringUtils.hasText(mappedRequestHeaders) || StringUtils.hasText(mappedResponseHeaders)) { BeanDefinitionBuilder headerMapperBuilder = BeanDefinitionBuilder.genericBeanDefinition( "org.springframework.integration.http.support.DefaultHttpHeaderMapper"); + headerMapperBuilder.setFactoryMethod("outboundMapper"); IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-request-headers", "outboundHeaderNames"); IntegrationNamespaceUtils.setValueIfAttributeDefined(headerMapperBuilder, element, "mapped-response-headers", "inboundHeaderNames"); builder.addPropertyValue("headerMapper", headerMapperBuilder.getBeanDefinition()); diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml index 979b25bbd0..da7cd79465 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests-context.xml @@ -1,13 +1,14 @@ - + xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation="http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd + http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> @@ -24,5 +25,19 @@ + + + + + + + + + + + + diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java index c3c0d14757..904db08985 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/config/HttpInboundGatewayParserTests.java @@ -35,8 +35,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.DirectFieldAccessor; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.support.GenericConversionService; import org.springframework.http.HttpHeaders; import org.springframework.integration.Message; import org.springframework.integration.MessageHeaders; @@ -59,6 +63,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class HttpInboundGatewayParserTests { + @Autowired + private DefaultListableBeanFactory beanFactory; @Autowired @Qualifier("inboundGateway") @@ -67,6 +73,10 @@ public class HttpInboundGatewayParserTests { @Autowired @Qualifier("withMappedHeaders") private HttpRequestHandlingMessagingGateway withMappedHeaders; + + @Autowired + @Qualifier("withMappedHeadersAndConverter") + private HttpRequestHandlingMessagingGateway withMappedHeadersAndConverter; @Autowired private HttpRequestHandlingController inboundController; @@ -130,5 +140,55 @@ public class HttpInboundGatewayParserTests { List abc = headers.get("X-abc"); assertEquals("abc", abc.get(0)); } + + @Test + @SuppressWarnings("unchecked") + public void requestWithHeadersWithConversionService() throws Exception { + DefaultHttpHeaderMapper headerMapper = + (DefaultHttpHeaderMapper) TestUtils.getPropertyValue(withMappedHeadersAndConverter, "headerMapper"); + + HttpHeaders headers = new HttpHeaders(); + headers.set("foo", "foo"); + headers.set("bar", "bar"); + headers.set("baz", "baz"); + Map map = (Map) headerMapper.toHeaders(headers); + assertTrue(map.size() == 2); + assertEquals("foo", map.get("foo")); + assertEquals("bar", map.get("bar")); + + Map mapOfHeaders = new HashMap(); + mapOfHeaders.put("abc", "abc"); + Person person = new Person(); + person.setName("Oleg"); + mapOfHeaders.put("person", person); + MessageHeaders mh = new MessageHeaders(mapOfHeaders); + headers = new HttpHeaders(); + headerMapper.fromHeaders(mh, headers); + assertTrue(headers.size() == 2); + List abc = headers.get("X-abc"); + assertEquals("abc", abc.get(0)); + List personHeaders = headers.get("X-person"); + assertEquals("Oleg", personHeaders.get(0)); + } + + public static class Person{ + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public static class PersonConverter implements Converter{ + + public String convert(Person source) { + return source.getName(); + } + + } }