diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/availability/AvailabilityProbesHealthEndpointGroups.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/availability/AvailabilityProbesHealthEndpointGroups.java index c958e549cf9..056ef4ba75c 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/availability/AvailabilityProbesHealthEndpointGroups.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/availability/AvailabilityProbesHealthEndpointGroups.java @@ -122,7 +122,11 @@ class AvailabilityProbesHealthEndpointGroups implements HealthEndpointGroups, Ad } List additionalPaths = new ArrayList<>(); if (this.groups instanceof AdditionalPathsMapper additionalPathsMapper) { - additionalPaths.addAll(additionalPathsMapper.getAdditionalPaths(endpointId, webServerNamespace)); + List mappedAdditionalPaths = getAdditionalPaths(endpointId, webServerNamespace, + additionalPathsMapper); + if (mappedAdditionalPaths != null) { + additionalPaths.addAll(mappedAdditionalPaths); + } } additionalPaths.addAll(this.probeGroups.values() .stream() @@ -134,4 +138,9 @@ class AvailabilityProbesHealthEndpointGroups implements HealthEndpointGroups, Ad return additionalPaths; } + private static @Nullable List getAdditionalPaths(EndpointId endpointId, + WebServerNamespace webServerNamespace, AdditionalPathsMapper additionalPathsMapper) { + return additionalPathsMapper.getAdditionalPaths(endpointId, webServerNamespace); + } + } diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java index ba2439b8f7c..c6fe56c807d 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java @@ -63,7 +63,7 @@ public class ConditionsReportEndpoint { @ReadOperation public ConditionsDescriptor conditions() { - Map contextConditionEvaluations = new HashMap<>(); + Map<@Nullable String, ContextConditionsDescriptor> contextConditionEvaluations = new HashMap<>(); ConfigurableApplicationContext target = this.context; while (target != null) { contextConditionEvaluations.put(target.getId(), new ContextConditionsDescriptor(target)); @@ -85,13 +85,13 @@ public class ConditionsReportEndpoint { */ public static final class ConditionsDescriptor implements OperationResponseBody { - private final Map contexts; + private final Map<@Nullable String, ContextConditionsDescriptor> contexts; - private ConditionsDescriptor(Map contexts) { + private ConditionsDescriptor(Map<@Nullable String, ContextConditionsDescriptor> contexts) { this.contexts = contexts; } - public Map getContexts() { + public Map<@Nullable String, ContextConditionsDescriptor> getContexts() { return this.contexts; } diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/AccessLogCustomizer.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/AccessLogCustomizer.java index 8dacfc4463b..fe84b33bf47 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/AccessLogCustomizer.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/AccessLogCustomizer.java @@ -21,6 +21,7 @@ import org.jspecify.annotations.Nullable; import org.springframework.boot.web.server.WebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.core.Ordered; +import org.springframework.lang.Contract; /** * Base class for a {@link WebServerFactoryCustomizer} that customizes the web server's @@ -39,6 +40,7 @@ public abstract class AccessLogCustomizer this.prefix = prefix; } + @Contract("!null -> !null") protected @Nullable String customizePrefix(@Nullable String existingPrefix) { if (this.prefix == null) { return existingPrefix; diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ChildManagementContextInitializer.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ChildManagementContextInitializer.java index 506077feeb8..248405adce3 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ChildManagementContextInitializer.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ChildManagementContextInitializer.java @@ -85,32 +85,35 @@ class ChildManagementContextInitializer implements BeanRegistrationAotProcessor, if (!(this.parentContext instanceof WebServerApplicationContext)) { return; } - if (this.managementContext == null) { - ConfigurableApplicationContext managementContext = createManagementContext(); + ConfigurableApplicationContext managementContext = this.managementContext; + if (managementContext == null) { + managementContext = createManagementContext(); registerBeans(managementContext); managementContext.refresh(); this.managementContext = managementContext; } else { - this.managementContext.start(); + managementContext.start(); } } @Override public void stop() { - if (this.managementContext != null) { + ConfigurableApplicationContext managementContext = this.managementContext; + if (managementContext != null) { if (this.parentContext.isClosed()) { - this.managementContext.close(); + managementContext.close(); } else { - this.managementContext.stop(); + managementContext.stop(); } } } @Override public boolean isRunning() { - return this.managementContext != null && this.managementContext.isRunning(); + ConfigurableApplicationContext managementContext = this.managementContext; + return managementContext != null && managementContext.isRunning(); } @Override