GH-764 Fix output header mapping timing

Resolves #764
This commit is contained in:
Oleg Zhurakousky
2021-11-09 08:19:44 +01:00
parent 255211df85
commit 28eea09bc8
2 changed files with 13 additions and 9 deletions

View File

@@ -355,8 +355,9 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
? new BeanFactoryResolver(this.functionProperties.getApplicationContext()) ? new BeanFactoryResolver(this.functionProperties.getApplicationContext())
: null; : null;
HeaderEnricher enricher = new HeaderEnricher(configuration.getOutputHeaderMappingExpression(), beanResolver); HeaderEnricher enricher = new HeaderEnricher(configuration.getOutputHeaderMappingExpression(), beanResolver);
FunctionInvocationWrapper w = new FunctionInvocationWrapper("outputHeaderEnricher", enricher, Message.class, Message.class); Type mesageType = ResolvableType.forClassWithGenerics(Message.class, Object.class).getType();
composedFunction = (FunctionInvocationWrapper) w.andThen((Function<Object, Object>) composedFunction); FunctionInvocationWrapper enricherWrapper = new FunctionInvocationWrapper("outputHeaderEnricher", enricher, mesageType, mesageType);
composedFunction = (FunctionInvocationWrapper) composedFunction.andThen((Function<Object, Object>) enricherWrapper);
composedFunction.functionDefinition = functionDefinition; composedFunction.functionDefinition = functionDefinition;
} }
} }

View File

@@ -180,17 +180,17 @@ public class HeaderMappingTests {
SampleFunctionConfiguration.class).web(WebApplicationType.NONE).run( SampleFunctionConfiguration.class).web(WebApplicationType.NONE).run(
"--logging.level.org.springframework.cloud.function=DEBUG", "--logging.level.org.springframework.cloud.function=DEBUG",
"--spring.main.lazy-initialization=true", "--spring.main.lazy-initialization=true",
"--spring.cloud.function.configuration.foo.output-header-mapping-expression.key1='hello1'", "--spring.cloud.function.configuration.foo.output-header-mapping-expression.keyOut1='hello1'",
"--spring.cloud.function.configuration.foo.output-header-mapping-expression.key2=headers.contentType")) { "--spring.cloud.function.configuration.foo.output-header-mapping-expression.keyOut2=headers.contentType")) {
FunctionCatalog functionCatalog = context.getBean(FunctionCatalog.class); FunctionCatalog functionCatalog = context.getBean(FunctionCatalog.class);
FunctionInvocationWrapper function = functionCatalog.lookup("foo"); FunctionInvocationWrapper function = functionCatalog.lookup("foo");
Message<byte[]> result = (Message<byte[]>) function.apply(MessageBuilder.withPayload("helo") Message<byte[]> result = (Message<byte[]>) function.apply(MessageBuilder.withPayload("helo")
.setHeader(MessageHeaders.CONTENT_TYPE, "application/json").build()); .setHeader(MessageHeaders.CONTENT_TYPE, "application/json").build());
assertThat(result.getHeaders().containsKey("key1")).isTrue(); assertThat(result.getHeaders().containsKey("keyOut1")).isTrue();
assertThat(result.getHeaders().get("key1")).isEqualTo("hello1"); assertThat(result.getHeaders().get("keyOut1")).isEqualTo("hello1");
assertThat(result.getHeaders().containsKey("key2")).isTrue(); assertThat(result.getHeaders().containsKey("keyOut2")).isTrue();
assertThat(result.getHeaders().get("key2")).isEqualTo("application/json"); assertThat(result.getHeaders().get("keyOut2")).isEqualTo("application/json");
} }
} }
@@ -255,7 +255,10 @@ public class HeaderMappingTests {
@Bean @Bean
public Function<Message<?>, Message<?>> foo() { public Function<Message<?>, Message<?>> foo() {
return x -> x; return x -> {
assertThat(x.getHeaders().containsKey("keyOut1")).isFalse();
return x;
};
} }
} }
} }