diff --git a/pom.xml b/pom.xml index bd8123e63..60ea10410 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,8 @@ 1.8 ${java.version} ${java.version} - 1.0.27.BUILD-SNAPSHOT + + 1.0.26.RELEASE spring-cloud-function true true diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java index 2bda325e6..5ca33bd4e 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java @@ -82,6 +82,7 @@ public class FunctionProperties implements EnvironmentAware, ApplicationContextA */ private String routingExpression; + @SuppressWarnings({ "unchecked", "rawtypes" }) public void setConfiguration(Map configuration) { for (Entry entry : configuration.entrySet()) { String propertyX = "spring.cloud.function.configuration." + entry.getKey() + ".input-header-mapping-expression."; @@ -90,14 +91,18 @@ public class FunctionProperties implements EnvironmentAware, ApplicationContextA for (Object k : headerMapping.keySet()) { if (this.environment.containsProperty(propertyX + k) || this.environment.containsProperty(propertyY + k)) { Map originalMapping = entry.getValue().getInputHeaderMappingExpression(); - entry.getValue().setInputHeaderMappingExpression(Collections.singletonMap("0", originalMapping)); - break; - } - else { - break; + Map current = entry.getValue().getInputHeaderMappingExpression(); + if (current.containsKey("0")) { + ((Map) current.get("0")).put(k, headerMapping.get(k)); + } + else { + entry.getValue().setInputHeaderMappingExpression(Collections.singletonMap("0", originalMapping)); + break; + } } } } + this.configuration = configuration; } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/InputHeaderMappingTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/InputHeaderMappingTests.java index 10893248f..0467f16e7 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/InputHeaderMappingTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/InputHeaderMappingTests.java @@ -69,6 +69,40 @@ public class InputHeaderMappingTests { } } + @Test + public void testInputHeaderMappingPropertyWithIndexMix() throws Exception { + try (ConfigurableApplicationContext context = new SpringApplicationBuilder( + SampleFunctionConfiguration.class).web(WebApplicationType.NONE).run( + "--logging.level.org.springframework.cloud.function=DEBUG", + "--spring.main.lazy-initialization=true", + "--spring.cloud.function.configuration.echo.input-header-mapping-expression[0].key1='hello1'", + "--spring.cloud.function.configuration.echo.input-header-mapping-expression[0].key2='hello2'", + "--spring.cloud.function.configuration.echo.input-header-mapping-expression.foo=headers.contentType")) { + + FunctionCatalog functionCatalog = context.getBean(FunctionCatalog.class); + FunctionInvocationWrapper function = functionCatalog.lookup("echo"); + function.apply(MessageBuilder.withPayload("helo") + .setHeader(MessageHeaders.CONTENT_TYPE, "application/json").build()); + } + } + + @Test + public void testInputHeaderMappingPropertyWithIndexMixDeux() throws Exception { + try (ConfigurableApplicationContext context = new SpringApplicationBuilder( + SampleFunctionConfiguration.class).web(WebApplicationType.NONE).run( + "--logging.level.org.springframework.cloud.function=DEBUG", + "--spring.main.lazy-initialization=true", + "--spring.cloud.function.configuration.echo.input-header-mapping-expression.key1='hello1'", + "--spring.cloud.function.configuration.echo.input-header-mapping-expression[0].key2='hello2'", + "--spring.cloud.function.configuration.echo.input-header-mapping-expression.foo=headers.contentType")) { + + FunctionCatalog functionCatalog = context.getBean(FunctionCatalog.class); + FunctionInvocationWrapper function = functionCatalog.lookup("echo"); + function.apply(MessageBuilder.withPayload("helo") + .setHeader(MessageHeaders.CONTENT_TYPE, "application/json").build()); + } + } + @Test public void testInputHeaderMappingPropertyWithoutIndex() throws Exception { try (ConfigurableApplicationContext context = new SpringApplicationBuilder(