Reworked so that multiple @RemoteApplicationScan annotations work together

fixes gh-214
This commit is contained in:
Tom Briers
2020-01-17 08:05:43 +01:00
committed by Spencer Gibb
parent d5985ac16d
commit da87ba6721
2 changed files with 44 additions and 10 deletions

View File

@@ -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<String> 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<>();
}
}

View File

@@ -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 {