diff --git a/module/spring-boot-cloudfoundry/src/main/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfiguration.java b/module/spring-boot-cloudfoundry/src/main/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfiguration.java index 7a472afcf967..c6c7ffcabe6a 100644 --- a/module/spring-boot-cloudfoundry/src/main/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfiguration.java +++ b/module/spring-boot-cloudfoundry/src/main/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfiguration.java @@ -83,15 +83,6 @@ public final class CloudFoundryReactiveActuatorAutoConfiguration { private static final String BASE_PATH = "/cloudfoundryapplication"; - @Bean - @ConditionalOnMissingBean - @ConditionalOnAvailableEndpoint - @ConditionalOnBean({ HealthEndpoint.class, ReactiveHealthEndpointWebExtension.class }) - CloudFoundryReactiveHealthEndpointWebExtension cloudFoundryReactiveHealthEndpointWebExtension( - ReactiveHealthEndpointWebExtension reactiveHealthEndpointWebExtension) { - return new CloudFoundryReactiveHealthEndpointWebExtension(reactiveHealthEndpointWebExtension); - } - @Bean @ConditionalOnMissingBean @ConditionalOnAvailableEndpoint @@ -151,6 +142,21 @@ private CorsConfiguration getCorsConfiguration() { return corsConfiguration; } + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass(HealthEndpoint.class) + static class HealthConfiguration { + + @Bean + @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint + @ConditionalOnBean({ HealthEndpoint.class, ReactiveHealthEndpointWebExtension.class }) + CloudFoundryReactiveHealthEndpointWebExtension cloudFoundryReactiveHealthEndpointWebExtension( + ReactiveHealthEndpointWebExtension reactiveHealthEndpointWebExtension) { + return new CloudFoundryReactiveHealthEndpointWebExtension(reactiveHealthEndpointWebExtension); + } + + } + @Configuration(proxyBeanMethods = false) @ConditionalOnClass(MatcherSecurityWebFilterChain.class) static class IgnoredPathsSecurityConfiguration { diff --git a/module/spring-boot-cloudfoundry/src/test/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfigurationTests.java b/module/spring-boot-cloudfoundry/src/test/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfigurationTests.java index 67925383d253..d1dddecce07c 100644 --- a/module/spring-boot-cloudfoundry/src/test/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfigurationTests.java +++ b/module/spring-boot-cloudfoundry/src/test/java/org/springframework/boot/cloudfoundry/autoconfigure/actuate/endpoint/reactive/CloudFoundryReactiveActuatorAutoConfigurationTests.java @@ -59,6 +59,7 @@ import org.springframework.boot.ssl.jks.JksSslStoreBundle; import org.springframework.boot.ssl.jks.JksSslStoreDetails; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; +import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import org.springframework.boot.testsupport.classpath.resources.WithPackageResources; import org.springframework.boot.testsupport.classpath.resources.WithResource; import org.springframework.boot.webclient.WebClientCustomizer; @@ -96,16 +97,18 @@ class CloudFoundryReactiveActuatorAutoConfigurationTests { private static final String V3_JSON = ApiVersion.V3.getProducedMimeType().toString(); + private static final AutoConfigurations MANDATORY_AUTO_CONFIGURATIONS = AutoConfigurations.of( + ReactiveWebSecurityAutoConfiguration.class, WebFluxAutoConfiguration.class, JacksonAutoConfiguration.class, + HttpMessageConvertersAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, + WebClientCustomizerConfig.class, WebClientAutoConfiguration.class, ManagementContextAutoConfiguration.class, + EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class, InfoContributorAutoConfiguration.class, + InfoEndpointAutoConfiguration.class, ProjectInfoAutoConfiguration.class, + CloudFoundryReactiveActuatorAutoConfiguration.class); + private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(ReactiveWebSecurityAutoConfiguration.class, - WebFluxAutoConfiguration.class, JacksonAutoConfiguration.class, - HttpMessageConvertersAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, - WebClientCustomizerConfig.class, WebClientAutoConfiguration.class, - ManagementContextAutoConfiguration.class, EndpointAutoConfiguration.class, - WebEndpointAutoConfiguration.class, HealthContributorAutoConfiguration.class, - HealthContributorRegistryAutoConfiguration.class, HealthEndpointAutoConfiguration.class, - InfoContributorAutoConfiguration.class, InfoEndpointAutoConfiguration.class, - ProjectInfoAutoConfiguration.class, CloudFoundryReactiveActuatorAutoConfiguration.class)) + .withConfiguration(MANDATORY_AUTO_CONFIGURATIONS) + .withConfiguration(AutoConfigurations.of(HealthContributorAutoConfiguration.class, + HealthContributorRegistryAutoConfiguration.class, HealthEndpointAutoConfiguration.class)) .withUserConfiguration(UserDetailsServiceConfiguration.class); private static final String BASE_PATH = "/cloudfoundryapplication"; @@ -115,6 +118,16 @@ void close() { HttpResources.reset(); } + @Test + @ClassPathExclusions(packages = "org.springframework.boot.health.actuate.endpoint") + void refreshSucceedsWithoutHealth() { + new ReactiveWebApplicationContextRunner().withConfiguration(MANDATORY_AUTO_CONFIGURATIONS) + .withUserConfiguration(UserDetailsServiceConfiguration.class) + .withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id", + "vcap.application.cf_api:https://my-cloud-controller.com") + .run((context) -> assertThat(context).hasNotFailed()); + } + @Test void cloudFoundryPlatformActive() { this.contextRunner