diff --git a/spring-web/src/main/java/org/springframework/web/service/registry/AbstractHttpServiceRegistrar.java b/spring-web/src/main/java/org/springframework/web/service/registry/AbstractHttpServiceRegistrar.java index 9fc72368d51..1ee41b4f5d3 100644 --- a/spring-web/src/main/java/org/springframework/web/service/registry/AbstractHttpServiceRegistrar.java +++ b/spring-web/src/main/java/org/springframework/web/service/registry/AbstractHttpServiceRegistrar.java @@ -147,20 +147,22 @@ public final void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefin registerHttpServices(new DefaultGroupRegistry(), metadata); - RootBeanDefinition proxyRegistryBeanDef = createOrGetRegistry(beanRegistry); - - mergeGroups(proxyRegistryBeanDef); - - this.groupsMetadata.forEachRegistration((groupName, types) -> types.forEach(type -> { - RootBeanDefinition proxyBeanDef = new RootBeanDefinition(); - proxyBeanDef.setBeanClassName(type); - proxyBeanDef.setAttribute(HTTP_SERVICE_GROUP_NAME_ATTRIBUTE, groupName); - proxyBeanDef.setInstanceSupplier(() -> getProxyInstance(groupName, type)); - String beanName = (groupName + "#" + type); - if (!beanRegistry.containsBeanDefinition(beanName)) { - beanRegistry.registerBeanDefinition(beanName, proxyBeanDef); - } - })); + if (this.groupsMetadata.hasRegistrations()) { + RootBeanDefinition proxyRegistryBeanDef = createOrGetRegistry(beanRegistry); + + mergeGroups(proxyRegistryBeanDef); + + this.groupsMetadata.forEachRegistration((groupName, types) -> types.forEach(type -> { + RootBeanDefinition proxyBeanDef = new RootBeanDefinition(); + proxyBeanDef.setBeanClassName(type); + proxyBeanDef.setAttribute(HTTP_SERVICE_GROUP_NAME_ATTRIBUTE, groupName); + proxyBeanDef.setInstanceSupplier(() -> getProxyInstance(groupName, type)); + String beanName = (groupName + "#" + type); + if (!beanRegistry.containsBeanDefinition(beanName)) { + beanRegistry.registerBeanDefinition(beanName, proxyBeanDef); + } + })); + } } /** diff --git a/spring-web/src/main/java/org/springframework/web/service/registry/GroupsMetadata.java b/spring-web/src/main/java/org/springframework/web/service/registry/GroupsMetadata.java index 04df0e33a0e..4aa5ec1c8bb 100644 --- a/spring-web/src/main/java/org/springframework/web/service/registry/GroupsMetadata.java +++ b/spring-web/src/main/java/org/springframework/web/service/registry/GroupsMetadata.java @@ -97,6 +97,13 @@ Stream registrations() { return this.groupMap.values().stream(); } + /** + * Return if there are any {@link Registration registrations}. + */ + boolean hasRegistrations() { + return !this.groupMap.isEmpty(); + } + /** * Registration metadata for an {@link HttpServiceGroup}. diff --git a/spring-web/src/test/java/org/springframework/web/service/registry/ClientHttpServiceRegistrarTests.java b/spring-web/src/test/java/org/springframework/web/service/registry/ClientHttpServiceRegistrarTests.java index 7f60b777538..57b507fa700 100644 --- a/spring-web/src/test/java/org/springframework/web/service/registry/ClientHttpServiceRegistrarTests.java +++ b/spring-web/src/test/java/org/springframework/web/service/registry/ClientHttpServiceRegistrarTests.java @@ -22,6 +22,9 @@ import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.core.env.StandardEnvironment; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.type.AnnotationMetadata; @@ -63,6 +66,13 @@ protected void registerHttpServices(GroupRegistry registry, AnnotationMetadata i TestGroup.ofListing("echo", EchoClientA.class, EchoClientB.class)); } + @Test + void registerWhenNoClientsDoesNotCreateBeans() { + try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(NothingFoundConfiguration.class)) { + assertThat(context.getBeanNamesForType(HttpServiceProxyRegistry.class)).isEmpty(); + } + } + private void assertGroups(TestGroup... expectedGroups) { Map groupMap = this.groupRegistry.groupMap(); assertThat(groupMap.size()).isEqualTo(expectedGroups.length); @@ -75,4 +85,19 @@ private void assertGroups(TestGroup... expectedGroups) { } } + @Configuration(proxyBeanMethods = false) + @Import(NothingFoundRegistrar.class) + static class NothingFoundConfiguration { + + } + + static class NothingFoundRegistrar extends AbstractClientHttpServiceRegistrar { + + @Override + protected void registerHttpServices(GroupRegistry registry, + AnnotationMetadata importingClassMetadata) { + findAndRegisterHttpServiceClients(registry, List.of("com.example.missing.package")); + } + } + } diff --git a/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceRegistrarTests.java b/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceRegistrarTests.java index 80b34af8105..35ef88180e4 100644 --- a/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceRegistrarTests.java +++ b/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceRegistrarTests.java @@ -120,8 +120,7 @@ void defaultClientType() { @Test void noRegistrations() { doRegister(registry -> {}); - assertRegistryBeanDef(); - assertBeanDefinitionCount(1); + assertBeanDefinitionCount(0); }