Merge pull request #50916 from dlwldnjs1009

* cf-reactive-health-absent-4.0.x:
  Polish "Guard reactive Cloud Foundry health extension"
  Guard reactive Cloud Foundry health extension

Closes gh-50916
This commit is contained in:
Stéphane Nicoll
2026-07-14 11:12:19 +02:00
2 changed files with 37 additions and 18 deletions
@@ -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 @@ public final class CloudFoundryReactiveActuatorAutoConfiguration {
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 {
@@ -59,6 +59,7 @@ import org.springframework.boot.ssl.SslBundle;
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 @@ class CloudFoundryReactiveActuatorAutoConfigurationTests {
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