From e7be2b8c5a0203fc58d8740cb11fac44c62ef5ba Mon Sep 17 00:00:00 2001 From: spencergibb Date: Mon, 29 Mar 2021 16:25:33 -0400 Subject: [PATCH] Register env repo properties as beans. The `CompositeEnvironmentBeanFactoryPostProcessor` binds the required properties for a EnvironmentRepositoryFactory, but does not register it as a bean. This is now done with a supplier to the bound instance. Fixes gh-1720 --- .../test/java/sample/ApplicationBootstrapTests.java | 9 +++++++++ .../CompositeEnvironmentBeanFactoryPostProcessor.java | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spring-cloud-config-sample/src/test/java/sample/ApplicationBootstrapTests.java b/spring-cloud-config-sample/src/test/java/sample/ApplicationBootstrapTests.java index 34d2bbb2..6f24efca 100644 --- a/spring-cloud-config-sample/src/test/java/sample/ApplicationBootstrapTests.java +++ b/spring-cloud-config-sample/src/test/java/sample/ApplicationBootstrapTests.java @@ -29,6 +29,7 @@ import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointPr import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentProperties; import org.springframework.cloud.config.server.test.ConfigServerTestUtils; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.junit4.SpringRunner; @@ -107,4 +108,12 @@ public class ApplicationBootstrapTests { assertThat(property).containsEntry("value", "bar"); } + @Test + public void propertiesBeansRegisterByCompositeEnvBeanFactoryPostProcessor() { + String[] beanNames = server + .getBeanNamesForType(MultipleJGitEnvironmentProperties.class); + assertThat(beanNames).isNotNull() + .anyMatch(s -> s.matches("git-env-repo-properties\\d")); + } + } diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/CompositeEnvironmentBeanFactoryPostProcessor.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/CompositeEnvironmentBeanFactoryPostProcessor.java index 0cf497af..d52027e3 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/CompositeEnvironmentBeanFactoryPostProcessor.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/CompositeEnvironmentBeanFactoryPostProcessor.java @@ -46,9 +46,12 @@ public class CompositeEnvironmentBeanFactoryPostProcessor this.environment = environment; } + @SuppressWarnings("unchecked") @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; + List typePropertyList = CompositeUtils .getCompositeTypeList(this.environment); for (int i = 0; i < typePropertyList.size(); i++) { @@ -61,13 +64,19 @@ public class CompositeEnvironmentBeanFactoryPostProcessor propertiesClass = (Class) factoryTypes[1]; EnvironmentRepositoryProperties properties = bindProperties(i, propertiesClass, this.environment); + AbstractBeanDefinition propertiesDefinition = BeanDefinitionBuilder + .genericBeanDefinition(EnvironmentRepositoryProperties.class, + () -> properties) + .getBeanDefinition(); + String propertiesBeanName = String.format("%s-env-repo-properties%d", type, + i); + registry.registerBeanDefinition(propertiesBeanName, propertiesDefinition); AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder .genericBeanDefinition(EnvironmentRepository.class) .setFactoryMethodOnBean("build", factoryName) .addConstructorArgValue(properties).getBeanDefinition(); String beanName = String.format("%s-env-repo%d", type, i); - BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; registry.registerBeanDefinition(beanName, beanDefinition); } }