From 1e65ff7132e5a90debd5c19b5afd717f1aca27ac Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 25 Nov 2020 09:38:15 +0000 Subject: [PATCH] Refactor some lambdas to enable native image building Without this change a function with a Tomcat wrapper cannot be compiled to a native image (or it can but it fails at runtime) because there are lambda$$$ methods in the byte code that refer to missing types. --- .../web/function/FunctionEndpointInitializer.java | 12 ++++++++++-- .../web/source/FunctionExporterInitializer.java | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java index 9f88e224d..22b40c8d7 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java @@ -108,8 +108,7 @@ class FunctionEndpointInitializer implements ApplicationContextInitializer new FunctionEndpointFactory(context.getBean(FunctionCatalog.class), context.getBean(RequestProcessor.class), context.getEnvironment())); - context.registerBean(RouterFunction.class, - () -> context.getBean(FunctionEndpointFactory.class).functionEndpoints()); + RouterFunctionRegister.register(context); } private HttpWebHandlerAdapter httpHandler(GenericApplicationContext context) { @@ -131,6 +130,15 @@ class FunctionEndpointInitializer implements ApplicationContextInitializer context.getBean(FunctionEndpointFactory.class).functionEndpoints()); + } + + } + private static class ServerListener implements SmartApplicationListener { private static Log logger = LogFactory.getLog(ServerListener.class); diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java index a7bcdf3f7..41e906d1d 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java @@ -16,6 +16,8 @@ package org.springframework.cloud.function.web.source; +import java.util.function.Supplier; + import org.springframework.boot.web.reactive.context.ConfigurableReactiveWebEnvironment; import org.springframework.boot.web.reactive.context.ReactiveWebApplicationContext; import org.springframework.cloud.function.context.FunctionCatalog; @@ -27,6 +29,7 @@ import org.springframework.util.ClassUtils; import org.springframework.web.context.ConfigurableWebEnvironment; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClient.Builder; /** * @author Dave Syer @@ -49,7 +52,12 @@ class FunctionExporterInitializer implements ApplicationContextInitializer WebClient.builder()); + context.registerBean(WebClient.Builder.class, new Supplier() { + @Override + public Builder get() { + return WebClient.builder(); + } + }); } } }