From da87ba6721a76a70da380eb879cf9212aec75981 Mon Sep 17 00:00:00 2001 From: Tom Briers Date: Fri, 17 Jan 2020 08:05:43 +0100 Subject: [PATCH] Reworked so that multiple @RemoteApplicationScan annotations work together fixes gh-214 --- .../RemoteApplicationEventRegistrar.java | 43 +++++++++++++++---- .../RemoteApplicationEventScanTests.java | 11 ++++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventRegistrar.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventRegistrar.java index fc201d9..ab968fc 100644 --- a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventRegistrar.java +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventRegistrar.java @@ -16,6 +16,7 @@ package org.springframework.cloud.bus.jackson; +import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -35,6 +36,10 @@ import org.springframework.util.StringUtils; */ public class RemoteApplicationEventRegistrar implements ImportBeanDefinitionRegistrar { + private static final String PACKAGES_TO_SCAN = "packagesToScan"; + + private static final String BUS_JSON_CONVERTER = "busJsonConverter"; + // patterned after Spring Integration IntegrationComponentScanRegistrar @Override @@ -65,15 +70,37 @@ public class RemoteApplicationEventRegistrar implements ImportBeanDefinitionRegi ClassUtils.getPackageName(importingClassMetadata.getClassName())); } - BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder - .genericBeanDefinition(BusJacksonMessageConverter.class); - beanDefinitionBuilder.addPropertyValue("packagesToScan", - basePackages.toArray(new String[basePackages.size()])); - AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition(); + if (!registry.containsBeanDefinition(BUS_JSON_CONVERTER)) { + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder + .genericBeanDefinition(BusJacksonMessageConverter.class); + beanDefinitionBuilder.addPropertyValue(PACKAGES_TO_SCAN, + basePackages.toArray(new String[basePackages.size()])); + AbstractBeanDefinition beanDefinition = beanDefinitionBuilder + .getBeanDefinition(); - BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, - "busJsonConverter"); - BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); + BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, + BUS_JSON_CONVERTER); + BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry); + } + else { + basePackages.addAll(getEarlierPackagesToScan(registry)); + registry.getBeanDefinition(BUS_JSON_CONVERTER).getPropertyValues() + .addPropertyValue(PACKAGES_TO_SCAN, + basePackages.toArray(new String[basePackages.size()])); + } + } + + private Set getEarlierPackagesToScan(final BeanDefinitionRegistry registry) { + if (registry.containsBeanDefinition(BUS_JSON_CONVERTER) + && registry.getBeanDefinition(BUS_JSON_CONVERTER).getPropertyValues() + .get(PACKAGES_TO_SCAN) != null) { + String[] earlierValues = (String[]) registry + .getBeanDefinition(BUS_JSON_CONVERTER).getPropertyValues() + .get(PACKAGES_TO_SCAN); + return new HashSet<>(Arrays.asList(earlierValues)); + } + + return new HashSet<>(); } } diff --git a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventScanTests.java b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventScanTests.java index 6981f26..c2bb235 100644 --- a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventScanTests.java +++ b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/jackson/RemoteApplicationEventScanTests.java @@ -39,6 +39,7 @@ import org.springframework.cloud.bus.jackson.SubtypeModuleTests.AnotherRemoteApp import org.springframework.cloud.bus.jackson.SubtypeModuleTests.MyRemoteApplicationEvent; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -149,12 +150,18 @@ public class RemoteApplicationEventScanTests { } @Configuration(proxyBeanMethods = false) - @RemoteApplicationEventScan( - basePackages = { "com.acme", "test.foo.bar", "fizz.buzz" }) + @Import(ExtraBasePackagesConfig.class) + @RemoteApplicationEventScan(basePackages = { "com.acme", "test.foo.bar" }) static class BasePackagesConfig { } + @Configuration(proxyBeanMethods = false) + @RemoteApplicationEventScan(basePackages = { "fizz.buzz" }) + static class ExtraBasePackagesConfig { + + } + @Configuration(proxyBeanMethods = false) @RemoteApplicationEventScan(basePackageClasses = TestRemoteApplicationEvent.class) static class BasePackageClassesConfig {