Browse Source

Improve null-safety of module/spring-boot-actuator-autoconfigure

See gh-46926
pull/46973/head
Moritz Halbritter 5 months ago
parent
commit
2e09df4e1a
  1. 11
      module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/availability/AvailabilityProbesHealthEndpointGroups.java
  2. 8
      module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java
  3. 2
      module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/AccessLogCustomizer.java
  4. 17
      module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/server/ChildManagementContextInitializer.java

11
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<String> additionalPaths = new ArrayList<>(); List<String> additionalPaths = new ArrayList<>();
if (this.groups instanceof AdditionalPathsMapper additionalPathsMapper) { if (this.groups instanceof AdditionalPathsMapper additionalPathsMapper) {
additionalPaths.addAll(additionalPathsMapper.getAdditionalPaths(endpointId, webServerNamespace)); List<String> mappedAdditionalPaths = getAdditionalPaths(endpointId, webServerNamespace,
additionalPathsMapper);
if (mappedAdditionalPaths != null) {
additionalPaths.addAll(mappedAdditionalPaths);
}
} }
additionalPaths.addAll(this.probeGroups.values() additionalPaths.addAll(this.probeGroups.values()
.stream() .stream()
@ -134,4 +138,9 @@ class AvailabilityProbesHealthEndpointGroups implements HealthEndpointGroups, Ad
return additionalPaths; return additionalPaths;
} }
private static @Nullable List<String> getAdditionalPaths(EndpointId endpointId,
WebServerNamespace webServerNamespace, AdditionalPathsMapper additionalPathsMapper) {
return additionalPathsMapper.getAdditionalPaths(endpointId, webServerNamespace);
}
} }

8
module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java

@ -63,7 +63,7 @@ public class ConditionsReportEndpoint {
@ReadOperation @ReadOperation
public ConditionsDescriptor conditions() { public ConditionsDescriptor conditions() {
Map<String, ContextConditionsDescriptor> contextConditionEvaluations = new HashMap<>(); Map<@Nullable String, ContextConditionsDescriptor> contextConditionEvaluations = new HashMap<>();
ConfigurableApplicationContext target = this.context; ConfigurableApplicationContext target = this.context;
while (target != null) { while (target != null) {
contextConditionEvaluations.put(target.getId(), new ContextConditionsDescriptor(target)); contextConditionEvaluations.put(target.getId(), new ContextConditionsDescriptor(target));
@ -85,13 +85,13 @@ public class ConditionsReportEndpoint {
*/ */
public static final class ConditionsDescriptor implements OperationResponseBody { public static final class ConditionsDescriptor implements OperationResponseBody {
private final Map<String, ContextConditionsDescriptor> contexts; private final Map<@Nullable String, ContextConditionsDescriptor> contexts;
private ConditionsDescriptor(Map<String, ContextConditionsDescriptor> contexts) { private ConditionsDescriptor(Map<@Nullable String, ContextConditionsDescriptor> contexts) {
this.contexts = contexts; this.contexts = contexts;
} }
public Map<String, ContextConditionsDescriptor> getContexts() { public Map<@Nullable String, ContextConditionsDescriptor> getContexts() {
return this.contexts; return this.contexts;
} }

2
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.WebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.lang.Contract;
/** /**
* Base class for a {@link WebServerFactoryCustomizer} that customizes the web server's * Base class for a {@link WebServerFactoryCustomizer} that customizes the web server's
@ -39,6 +40,7 @@ public abstract class AccessLogCustomizer<T extends WebServerFactory>
this.prefix = prefix; this.prefix = prefix;
} }
@Contract("!null -> !null")
protected @Nullable String customizePrefix(@Nullable String existingPrefix) { protected @Nullable String customizePrefix(@Nullable String existingPrefix) {
if (this.prefix == null) { if (this.prefix == null) {
return existingPrefix; return existingPrefix;

17
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)) { if (!(this.parentContext instanceof WebServerApplicationContext)) {
return; return;
} }
if (this.managementContext == null) { ConfigurableApplicationContext managementContext = this.managementContext;
ConfigurableApplicationContext managementContext = createManagementContext(); if (managementContext == null) {
managementContext = createManagementContext();
registerBeans(managementContext); registerBeans(managementContext);
managementContext.refresh(); managementContext.refresh();
this.managementContext = managementContext; this.managementContext = managementContext;
} }
else { else {
this.managementContext.start(); managementContext.start();
} }
} }
@Override @Override
public void stop() { public void stop() {
if (this.managementContext != null) { ConfigurableApplicationContext managementContext = this.managementContext;
if (managementContext != null) {
if (this.parentContext.isClosed()) { if (this.parentContext.isClosed()) {
this.managementContext.close(); managementContext.close();
} }
else { else {
this.managementContext.stop(); managementContext.stop();
} }
} }
} }
@Override @Override
public boolean isRunning() { public boolean isRunning() {
return this.managementContext != null && this.managementContext.isRunning(); ConfigurableApplicationContext managementContext = this.managementContext;
return managementContext != null && managementContext.isRunning();
} }
@Override @Override

Loading…
Cancel
Save