Reflection hack to provide Spring Boot 2.0 compatibility

This commit is contained in:
Dave Syer
2018-01-09 13:01:24 +00:00
parent 7c29aa34c2
commit 939f5a8b1a
2 changed files with 16 additions and 3 deletions

View File

@@ -30,6 +30,7 @@ import java.util.jar.Manifest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.function.context.catalog.FunctionInspector;
@@ -85,8 +86,7 @@ public class SpringFunctionInitializer implements Closeable {
return;
}
logger.info("Initializing: " + configurationClass);
SpringApplicationBuilder builder = new SpringApplicationBuilder(
configurationClass);
SpringApplicationBuilder builder = springApplication();
ConfigurableApplicationContext context = builder.web(false).run();
context.getAutowireCapableBeanFactory().autowireBean(this);
String name = context.getEnvironment().getProperty("function.name");
@@ -116,6 +116,19 @@ public class SpringFunctionInitializer implements Closeable {
this.context = context;
}
private SpringApplicationBuilder springApplication() {
if (ClassUtils.hasConstructor(SpringApplicationBuilder.class, Object[].class)) {
SpringApplicationBuilder builder = new SpringApplicationBuilder(
configurationClass);
return builder;
}
// Forward compatibility with Spring Boot 2.0 via reflection
return BeanUtils.instantiateClass(
ClassUtils.getConstructorIfAvailable(SpringApplicationBuilder.class,
Class[].class),
new Object[] { new Class<?>[] { configurationClass } });
}
protected Class<?> getInputType() {
if (inspector != null) {
return inspector.getInputType(function());

View File

@@ -14,7 +14,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<version>1.5.9.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>