diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/config/FunctionProxyApplicationListener.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/config/FunctionProxyApplicationListener.java index dc59431fa..8c22a38c4 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/config/FunctionProxyApplicationListener.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/config/FunctionProxyApplicationListener.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -41,6 +42,8 @@ import org.springframework.context.support.StaticApplicationContext; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.ReflectionUtils; /** * @author Mark Fisher @@ -117,9 +120,7 @@ public class FunctionProxyApplicationListener private void bind(ConfigurableApplicationContext context) { ConfigurationPropertiesBindingPostProcessor post = new ConfigurationPropertiesBindingPostProcessor(); - post.setBeanFactory(new DefaultListableBeanFactory()); - post.setEnvironment(context.getEnvironment()); - post.setApplicationContext(new StaticApplicationContext()); + maybeSetBeanFactory(context, post); try { post.afterPropertiesSet(); } @@ -129,6 +130,23 @@ public class FunctionProxyApplicationListener post.postProcessBeforeInitialization(this, getClass().getName()); } + private void maybeSetBeanFactory(ConfigurableApplicationContext context, + ConfigurationPropertiesBindingPostProcessor post) { + StaticApplicationContext other = new StaticApplicationContext(); + other.setEnvironment(context.getEnvironment()); + if (ReflectionUtils.findMethod(ConfigurationPropertiesBindingPostProcessor.class, + "setBeanFactory", BeanFactory.class) != null) { + post.setBeanFactory(new DefaultListableBeanFactory()); + post.setEnvironment(context.getEnvironment()); + } + else { + String name = "org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata"; + other.registerSingleton(name, ClassUtils.resolveClassName(name, null)); + other.setParent(context); + } + post.setApplicationContext(other); + } + private void registerByteCodeLoadingProxy(String name, String type, Resource resource, DefaultListableBeanFactory beanFactory) { Class proxyClass = null; diff --git a/spring-cloud-function-samples/function-sample-compiler/pom.xml b/spring-cloud-function-samples/function-sample-compiler/pom.xml index 951703bdc..d19a15a35 100644 --- a/spring-cloud-function-samples/function-sample-compiler/pom.xml +++ b/spring-cloud-function-samples/function-sample-compiler/pom.xml @@ -13,14 +13,14 @@ org.springframework.boot spring-boot-starter-parent - 1.5.11.RELEASE + 2.0.2.RELEASE 1.8 1.0.0.BUILD-SNAPSHOT - Ditmars.RELEASE + Elmhurst.RELEASE 3.1.2.RELEASE 1.0.10.RELEASE diff --git a/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledConsumerTests.java b/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledConsumerTests.java index 37dc3a411..aafbb9004 100644 --- a/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledConsumerTests.java +++ b/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledConsumerTests.java @@ -19,10 +19,10 @@ package com.example; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledFunctionTests.java b/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledFunctionTests.java index 29435826c..06b48178d 100644 --- a/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledFunctionTests.java +++ b/spring-cloud-function-samples/function-sample-compiler/src/test/java/com/example/SampleCompiledFunctionTests.java @@ -19,10 +19,10 @@ package com.example; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; @@ -44,7 +44,7 @@ public class SampleCompiledFunctionTests { public void lowercase() { assertThat(new TestRestTemplate().postForObject( "http://localhost:" + port + "/test", "it works", String.class)) - .isEqualTo("it works!!!"); + .contains("it works!!!"); } }