Move Actuator Jersey infrastructure to spring-boot-jersey
See gh-46116
This commit is contained in:
parent
2154ab77a8
commit
ea9897da22
|
@ -1,9 +1,6 @@
|
||||||
org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey.JerseyWebEndpointManagementContextConfiguration
|
|
||||||
org.springframework.boot.actuate.autoconfigure.endpoint.web.reactive.WebFluxEndpointManagementContextConfiguration
|
org.springframework.boot.actuate.autoconfigure.endpoint.web.reactive.WebFluxEndpointManagementContextConfiguration
|
||||||
org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration
|
org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration
|
||||||
org.springframework.boot.actuate.autoconfigure.security.servlet.SecurityRequestMatchersManagementContextConfiguration
|
org.springframework.boot.actuate.autoconfigure.security.servlet.SecurityRequestMatchersManagementContextConfiguration
|
||||||
org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration
|
|
||||||
org.springframework.boot.actuate.autoconfigure.web.jersey.JerseyChildManagementContextConfiguration
|
|
||||||
org.springframework.boot.actuate.autoconfigure.web.reactive.ReactiveManagementChildContextConfiguration
|
org.springframework.boot.actuate.autoconfigure.web.reactive.ReactiveManagementChildContextConfiguration
|
||||||
org.springframework.boot.actuate.autoconfigure.web.server.jetty.JettyReactiveManagementChildContextConfiguration
|
org.springframework.boot.actuate.autoconfigure.web.server.jetty.JettyReactiveManagementChildContextConfiguration
|
||||||
org.springframework.boot.actuate.autoconfigure.web.server.jetty.JettyServletManagementChildContextConfiguration
|
org.springframework.boot.actuate.autoconfigure.web.server.jetty.JettyServletManagementChildContextConfiguration
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.springframework.boot.actuate.autoconfigure.web.server.tomcat.TomcatSe
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||||
import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration;
|
import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.health.HealthEndpointJerseyExtensionAutoConfiguration;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration;
|
import org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||||
import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext;
|
import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext;
|
||||||
|
@ -50,6 +51,7 @@ class JerseyHealthEndpointAdditionalPathIntegrationTests extends
|
||||||
TomcatServletManagementContextAutoConfiguration.class, WebEndpointAutoConfiguration.class,
|
TomcatServletManagementContextAutoConfiguration.class, WebEndpointAutoConfiguration.class,
|
||||||
JerseyAutoConfiguration.class, ManagementContextAutoConfiguration.class,
|
JerseyAutoConfiguration.class, ManagementContextAutoConfiguration.class,
|
||||||
ServletManagementContextAutoConfiguration.class, HealthEndpointAutoConfiguration.class,
|
ServletManagementContextAutoConfiguration.class, HealthEndpointAutoConfiguration.class,
|
||||||
|
HealthEndpointJerseyExtensionAutoConfiguration.class,
|
||||||
DiskSpaceHealthContributorAutoConfiguration.class))
|
DiskSpaceHealthContributorAutoConfiguration.class))
|
||||||
.withInitializer(new ServerPortInfoApplicationContextInitializer())
|
.withInitializer(new ServerPortInfoApplicationContextInitializer())
|
||||||
.withClassLoader(new FilteredClassLoader(DispatcherServlet.class))
|
.withClassLoader(new FilteredClassLoader(DispatcherServlet.class))
|
||||||
|
|
|
@ -21,6 +21,9 @@ import org.glassfish.jersey.servlet.ServletContainer;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.JerseyChildManagementContextConfiguration;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.ManagementContextResourceConfigCustomizer;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||||
|
|
|
@ -21,6 +21,8 @@ import org.glassfish.jersey.servlet.ServletContainer;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.ManagementContextResourceConfigCustomizer;
|
||||||
import org.springframework.boot.jersey.autoconfigure.DefaultJerseyApplicationPath;
|
import org.springframework.boot.jersey.autoconfigure.DefaultJerseyApplicationPath;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||||
|
|
|
@ -74,7 +74,7 @@ class ManagementContextConfigurationImportSelectorTests {
|
||||||
// Remove JerseySameManagementContextConfiguration, as it specifies
|
// Remove JerseySameManagementContextConfiguration, as it specifies
|
||||||
// ManagementContextType.SAME and we asked for ManagementContextType.CHILD
|
// ManagementContextType.SAME and we asked for ManagementContextType.CHILD
|
||||||
expected.remove(
|
expected.remove(
|
||||||
"org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration");
|
"org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration");
|
||||||
assertThat(imports).containsExactlyInAnyOrderElementsOf(expected);
|
assertThat(imports).containsExactlyInAnyOrderElementsOf(expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "java-library"
|
id "java-library"
|
||||||
|
id "java-test-fixtures"
|
||||||
id "org.springframework.boot.auto-configuration"
|
id "org.springframework.boot.auto-configuration"
|
||||||
id "org.springframework.boot.configuration-properties"
|
id "org.springframework.boot.configuration-properties"
|
||||||
id "org.springframework.boot.deployed"
|
id "org.springframework.boot.deployed"
|
||||||
|
@ -27,17 +28,18 @@ description = "Spring Boot Actuator AutoConfigure"
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":spring-boot-project:spring-boot-actuator"))
|
api(project(":spring-boot-project:spring-boot-actuator"))
|
||||||
api(project(":spring-boot-project:spring-boot-autoconfigure"))
|
api(project(":spring-boot-project:spring-boot-autoconfigure"))
|
||||||
|
|
||||||
optional(project(":spring-boot-project:spring-boot-jersey"))
|
|
||||||
optional(project(":spring-boot-project:spring-boot-tomcat"))
|
optional(project(":spring-boot-project:spring-boot-tomcat"))
|
||||||
optional(project(":spring-boot-project:spring-boot-web-server"))
|
optional(project(":spring-boot-project:spring-boot-web-server"))
|
||||||
|
|
||||||
|
optional("com.fasterxml.jackson.core:jackson-databind")
|
||||||
optional("io.micrometer:micrometer-core")
|
optional("io.micrometer:micrometer-core")
|
||||||
optional("io.projectreactor:reactor-core")
|
optional("io.projectreactor:reactor-core")
|
||||||
optional("jakarta.servlet:jakarta.servlet-api")
|
optional("jakarta.servlet:jakarta.servlet-api")
|
||||||
optional("org.springframework:spring-webmvc")
|
optional("org.springframework:spring-webmvc")
|
||||||
optional("org.springframework.security:spring-security-config")
|
optional("org.springframework.security:spring-security-config")
|
||||||
|
|
||||||
|
testFixturesImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
|
||||||
|
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-test"))
|
testImplementation(project(":spring-boot-project:spring-boot-test"))
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
|
testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
|
||||||
testImplementation("org.springframework:spring-web")
|
testImplementation("org.springframework:spring-web")
|
||||||
|
|
|
@ -16,18 +16,11 @@
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.endpoint.web;
|
package org.springframework.boot.actuate.autoconfigure.endpoint.web;
|
||||||
|
|
||||||
import org.glassfish.jersey.server.ResourceConfig;
|
|
||||||
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.IncludeExcludeEndpointFilter;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.IncludeExcludeEndpointFilter;
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
|
||||||
import org.springframework.boot.actuate.endpoint.EndpointAccessResolver;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link ManagementContextConfiguration @ManagementContextConfiguration} for servlet
|
* {@link ManagementContextConfiguration @ManagementContextConfiguration} for servlet
|
||||||
|
@ -52,22 +45,4 @@ public class ServletEndpointManagementContextConfiguration {
|
||||||
exposure.getExclude());
|
exposure.getExclude());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
|
||||||
@ConditionalOnClass(ResourceConfig.class)
|
|
||||||
@ConditionalOnMissingClass("org.springframework.web.servlet.DispatcherServlet")
|
|
||||||
public static class JerseyServletEndpointManagementContextConfiguration {
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
@SuppressWarnings({ "deprecation", "removal" })
|
|
||||||
public org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar servletEndpointRegistrar(
|
|
||||||
WebEndpointProperties properties,
|
|
||||||
org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier servletEndpointsSupplier,
|
|
||||||
JerseyApplicationPath jerseyApplicationPath, EndpointAccessResolver endpointAccessResolver) {
|
|
||||||
return new org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar(
|
|
||||||
jerseyApplicationPath.getRelativePath(properties.getBasePath()),
|
|
||||||
servletEndpointsSupplier.getEndpoints(), endpointAccessResolver);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,39 +17,21 @@
|
||||||
package org.springframework.boot.actuate.autoconfigure.health;
|
package org.springframework.boot.actuate.autoconfigure.health;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import org.glassfish.jersey.server.ResourceConfig;
|
|
||||||
import org.glassfish.jersey.server.model.Resource;
|
|
||||||
import org.glassfish.jersey.servlet.ServletContainer;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.ObjectProvider;
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure;
|
||||||
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
|
|
||||||
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
|
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
||||||
import org.springframework.boot.actuate.endpoint.web.WebServerNamespace;
|
import org.springframework.boot.actuate.endpoint.web.WebServerNamespace;
|
||||||
import org.springframework.boot.actuate.endpoint.web.jersey.JerseyHealthEndpointAdditionalPathResourceFactory;
|
|
||||||
import org.springframework.boot.actuate.endpoint.web.servlet.AdditionalHealthEndpointPathsWebMvcHandlerMapping;
|
import org.springframework.boot.actuate.endpoint.web.servlet.AdditionalHealthEndpointPathsWebMvcHandlerMapping;
|
||||||
import org.springframework.boot.actuate.health.HealthContributorRegistry;
|
import org.springframework.boot.actuate.health.HealthContributorRegistry;
|
||||||
import org.springframework.boot.actuate.health.HealthEndpoint;
|
import org.springframework.boot.actuate.health.HealthEndpoint;
|
||||||
import org.springframework.boot.actuate.health.HealthEndpointGroups;
|
import org.springframework.boot.actuate.health.HealthEndpointGroups;
|
||||||
import org.springframework.boot.actuate.health.HealthEndpointWebExtension;
|
import org.springframework.boot.actuate.health.HealthEndpointWebExtension;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.boot.jersey.autoconfigure.DefaultJerseyApplicationPath;
|
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyProperties;
|
|
||||||
import org.springframework.boot.jersey.autoconfigure.ResourceConfigCustomizer;
|
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.servlet.DispatcherServlet;
|
import org.springframework.web.servlet.DispatcherServlet;
|
||||||
|
@ -96,81 +78,4 @@ class HealthEndpointWebExtensionConfiguration {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
|
||||||
@ConditionalOnClass(ResourceConfig.class)
|
|
||||||
@ConditionalOnMissingClass("org.springframework.web.servlet.DispatcherServlet")
|
|
||||||
static class JerseyAdditionalHealthEndpointPathsConfiguration {
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
JerseyAdditionalHealthEndpointPathsResourcesRegistrar jerseyAdditionalHealthEndpointPathsResourcesRegistrar(
|
|
||||||
WebEndpointsSupplier webEndpointsSupplier, HealthEndpointGroups healthEndpointGroups) {
|
|
||||||
ExposableWebEndpoint health = getHealthEndpoint(webEndpointsSupplier);
|
|
||||||
return new JerseyAdditionalHealthEndpointPathsResourcesRegistrar(health, healthEndpointGroups);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
|
||||||
@ConditionalOnMissingBean(ResourceConfig.class)
|
|
||||||
@EnableConfigurationProperties(JerseyProperties.class)
|
|
||||||
static class JerseyInfrastructureConfiguration {
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
@ConditionalOnMissingBean
|
|
||||||
JerseyApplicationPath jerseyApplicationPath(JerseyProperties properties, ResourceConfig config) {
|
|
||||||
return new DefaultJerseyApplicationPath(properties.getApplicationPath(), config);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
ResourceConfig resourceConfig(ObjectProvider<ResourceConfigCustomizer> resourceConfigCustomizers) {
|
|
||||||
ResourceConfig resourceConfig = new ResourceConfig();
|
|
||||||
resourceConfigCustomizers.orderedStream().forEach((customizer) -> customizer.customize(resourceConfig));
|
|
||||||
return resourceConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
ServletRegistrationBean<ServletContainer> jerseyServletRegistration(
|
|
||||||
JerseyApplicationPath jerseyApplicationPath, ResourceConfig resourceConfig) {
|
|
||||||
return new ServletRegistrationBean<>(new ServletContainer(resourceConfig),
|
|
||||||
jerseyApplicationPath.getUrlMapping());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static class JerseyAdditionalHealthEndpointPathsResourcesRegistrar implements ResourceConfigCustomizer {
|
|
||||||
|
|
||||||
private final ExposableWebEndpoint endpoint;
|
|
||||||
|
|
||||||
private final HealthEndpointGroups groups;
|
|
||||||
|
|
||||||
JerseyAdditionalHealthEndpointPathsResourcesRegistrar(ExposableWebEndpoint endpoint,
|
|
||||||
HealthEndpointGroups groups) {
|
|
||||||
this.endpoint = endpoint;
|
|
||||||
this.groups = groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void customize(ResourceConfig config) {
|
|
||||||
register(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void register(ResourceConfig config) {
|
|
||||||
EndpointMapping mapping = new EndpointMapping("");
|
|
||||||
JerseyHealthEndpointAdditionalPathResourceFactory resourceFactory = new JerseyHealthEndpointAdditionalPathResourceFactory(
|
|
||||||
WebServerNamespace.SERVER, this.groups);
|
|
||||||
Collection<Resource> endpointResources = resourceFactory
|
|
||||||
.createEndpointResources(mapping,
|
|
||||||
(this.endpoint != null) ? Collections.singletonList(this.endpoint) : Collections.emptyList())
|
|
||||||
.stream()
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.toList();
|
|
||||||
register(endpointResources, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void register(Collection<Resource> resources, ResourceConfig config) {
|
|
||||||
config.registerResources(new HashSet<>(resources));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,6 @@ import org.springframework.boot.actuate.autoconfigure.endpoint.condition.WithTes
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration.HealthEndpointGroupMembershipValidator.NoSuchHealthContributorException;
|
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration.HealthEndpointGroupMembershipValidator.NoSuchHealthContributorException;
|
||||||
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointReactiveWebExtensionConfiguration.WebFluxAdditionalHealthEndpointPathsConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointReactiveWebExtensionConfiguration.WebFluxAdditionalHealthEndpointPathsConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.JerseyAdditionalHealthEndpointPathsConfiguration;
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.MvcAdditionalHealthEndpointPathsConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.MvcAdditionalHealthEndpointPathsConfiguration;
|
||||||
import org.springframework.boot.actuate.endpoint.ApiVersion;
|
import org.springframework.boot.actuate.endpoint.ApiVersion;
|
||||||
import org.springframework.boot.actuate.endpoint.SecurityContext;
|
import org.springframework.boot.actuate.endpoint.SecurityContext;
|
||||||
|
@ -361,25 +360,6 @@ class HealthEndpointAutoConfigurationTests {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
@WithTestEndpointOutcomeExposureContributor
|
|
||||||
void additionalJerseyHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
|
|
||||||
this.contextRunner
|
|
||||||
.withConfiguration(
|
|
||||||
AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
|
|
||||||
.withClassLoader(
|
|
||||||
new FilteredClassLoader(Thread.currentThread().getContextClassLoader(), DispatcherServlet.class))
|
|
||||||
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
|
|
||||||
"management.endpoints.test.exposure.include=*")
|
|
||||||
.run((context) -> {
|
|
||||||
assertThat(context).hasNotFailed();
|
|
||||||
assertThat(context).hasSingleBean(HealthEndpoint.class);
|
|
||||||
assertThat(context).hasSingleBean(HealthEndpointWebExtension.class);
|
|
||||||
assertThat(context.getBean(WebEndpointsSupplier.class).getEndpoints()).isEmpty();
|
|
||||||
assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsConfiguration.class);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@WithTestEndpointOutcomeExposureContributor
|
@WithTestEndpointOutcomeExposureContributor
|
||||||
void additionalReactiveHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
|
void additionalReactiveHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
|
||||||
|
|
|
@ -40,6 +40,7 @@ import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
|
||||||
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
|
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
|
||||||
import org.springframework.boot.actuate.endpoint.web.annotation.AbstractWebEndpointIntegrationTests;
|
import org.springframework.boot.actuate.endpoint.web.annotation.AbstractWebEndpointIntegrationTests;
|
||||||
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpointDiscoverer;
|
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpointDiscoverer;
|
||||||
|
import org.springframework.boot.jersey.actuate.endpoint.web.JerseyEndpointResourceFactory;
|
||||||
import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory;
|
import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory;
|
||||||
import org.springframework.boot.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext;
|
import org.springframework.boot.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext;
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
|
|
|
@ -43,13 +43,13 @@ import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
|
||||||
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
|
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
|
||||||
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
|
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
|
||||||
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpointDiscoverer;
|
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpointDiscoverer;
|
||||||
import org.springframework.boot.actuate.endpoint.web.jersey.JerseyEndpointResourceFactory;
|
|
||||||
import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
|
import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
|
||||||
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
|
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
|
||||||
import org.springframework.boot.actuate.endpoint.web.test.WebEndpointTest.Infrastructure;
|
import org.springframework.boot.actuate.endpoint.web.test.WebEndpointTest.Infrastructure;
|
||||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||||
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration;
|
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration;
|
||||||
import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration;
|
import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration;
|
||||||
|
import org.springframework.boot.jersey.actuate.endpoint.web.JerseyEndpointResourceFactory;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration;
|
import org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration;
|
||||||
import org.springframework.boot.jersey.autoconfigure.ResourceConfigCustomizer;
|
import org.springframework.boot.jersey.autoconfigure.ResourceConfigCustomizer;
|
||||||
import org.springframework.boot.reactor.netty.NettyReactiveWebServerFactory;
|
import org.springframework.boot.reactor.netty.NettyReactiveWebServerFactory;
|
||||||
|
|
|
@ -48,8 +48,6 @@ dependencies {
|
||||||
optional("org.apache.tomcat.embed:tomcat-embed-core")
|
optional("org.apache.tomcat.embed:tomcat-embed-core")
|
||||||
optional("org.aspectj:aspectjweaver")
|
optional("org.aspectj:aspectjweaver")
|
||||||
optional("org.eclipse.angus:angus-mail")
|
optional("org.eclipse.angus:angus-mail")
|
||||||
optional("org.glassfish.jersey.core:jersey-server")
|
|
||||||
optional("org.glassfish.jersey.containers:jersey-container-servlet-core")
|
|
||||||
optional("org.hibernate.validator:hibernate-validator")
|
optional("org.hibernate.validator:hibernate-validator")
|
||||||
optional("org.influxdb:influxdb-java")
|
optional("org.influxdb:influxdb-java")
|
||||||
optional("org.springframework:spring-context-support")
|
optional("org.springframework:spring-context-support")
|
||||||
|
@ -73,13 +71,11 @@ dependencies {
|
||||||
testImplementation("io.projectreactor:reactor-test")
|
testImplementation("io.projectreactor:reactor-test")
|
||||||
testImplementation("net.minidev:json-smart")
|
testImplementation("net.minidev:json-smart")
|
||||||
testImplementation("org.apache.logging.log4j:log4j-to-slf4j")
|
testImplementation("org.apache.logging.log4j:log4j-to-slf4j")
|
||||||
testImplementation("org.glassfish.jersey.media:jersey-media-json-jackson")
|
|
||||||
|
|
||||||
testRuntimeOnly(project(":spring-boot-project:spring-boot-http-codec"))
|
testRuntimeOnly(project(":spring-boot-project:spring-boot-http-codec"))
|
||||||
testRuntimeOnly("ch.qos.logback:logback-classic")
|
testRuntimeOnly("ch.qos.logback:logback-classic")
|
||||||
testRuntimeOnly("io.projectreactor.netty:reactor-netty-http")
|
testRuntimeOnly("io.projectreactor.netty:reactor-netty-http")
|
||||||
testRuntimeOnly("jakarta.xml.bind:jakarta.xml.bind-api")
|
testRuntimeOnly("jakarta.xml.bind:jakarta.xml.bind-api")
|
||||||
testRuntimeOnly("org.apache.tomcat.embed:tomcat-embed-el")
|
testRuntimeOnly("org.apache.tomcat.embed:tomcat-embed-el")
|
||||||
testRuntimeOnly("org.glassfish.jersey.ext:jersey-spring6")
|
|
||||||
testRuntimeOnly("org.hsqldb:hsqldb")
|
testRuntimeOnly("org.hsqldb:hsqldb")
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,14 +36,17 @@ dependencies {
|
||||||
|
|
||||||
implementation("org.springframework:spring-web")
|
implementation("org.springframework:spring-web")
|
||||||
|
|
||||||
|
optional(project(":spring-boot-project:spring-boot-actuator-autoconfigure"))
|
||||||
optional(project(":spring-boot-project:spring-boot-autoconfigure"))
|
optional(project(":spring-boot-project:spring-boot-autoconfigure"))
|
||||||
optional(project(":spring-boot-project:spring-boot-jackson"))
|
optional(project(":spring-boot-project:spring-boot-jackson"))
|
||||||
|
optional("io.projectreactor:reactor-core")
|
||||||
|
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-restclient"))
|
testImplementation(project(":spring-boot-project:spring-boot-restclient"))
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-test"))
|
testImplementation(project(":spring-boot-project:spring-boot-test"))
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-tomcat"))
|
testImplementation(project(":spring-boot-project:spring-boot-tomcat"))
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
|
testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
|
||||||
testImplementation(project(":spring-boot-project:spring-boot-web-server-test"))
|
testImplementation(project(":spring-boot-project:spring-boot-web-server-test"))
|
||||||
|
testImplementation(testFixtures(project(":spring-boot-project:spring-boot-actuator-autoconfigure")))
|
||||||
testImplementation("jakarta.servlet:jakarta.servlet-api")
|
testImplementation("jakarta.servlet:jakarta.servlet-api")
|
||||||
|
|
||||||
testRuntimeOnly("ch.qos.logback:logback-classic")
|
testRuntimeOnly("ch.qos.logback:logback-classic")
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-present the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web;
|
||||||
|
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
|
||||||
|
import org.springframework.boot.actuate.endpoint.EndpointAccessResolver;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||||
|
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ManagementContextConfiguration @ManagementContextConfiguration} for Jetty
|
||||||
|
* endpoints.
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @author Madhura Bhave
|
||||||
|
* @since 4.0.0
|
||||||
|
*/
|
||||||
|
@ManagementContextConfiguration(proxyBeanMethods = false)
|
||||||
|
@ConditionalOnWebApplication(type = Type.SERVLET)
|
||||||
|
@ConditionalOnMissingClass("org.springframework.web.servlet.DispatcherServlet")
|
||||||
|
public class JerseyEndpointManagementContextConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@SuppressWarnings("removal")
|
||||||
|
public org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar servletEndpointRegistrar(
|
||||||
|
WebEndpointProperties properties,
|
||||||
|
org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier servletEndpointsSupplier,
|
||||||
|
JerseyApplicationPath jerseyApplicationPath, EndpointAccessResolver endpointAccessResolver) {
|
||||||
|
return new org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar(
|
||||||
|
jerseyApplicationPath.getRelativePath(properties.getBasePath()),
|
||||||
|
servletEndpointsSupplier.getEndpoints(), endpointAccessResolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -34,7 +34,6 @@ import org.springframework.boot.actuate.autoconfigure.endpoint.condition.Conditi
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure;
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.jersey.ManagementContextResourceConfigCustomizer;
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
|
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
|
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
|
||||||
import org.springframework.boot.actuate.endpoint.EndpointId;
|
import org.springframework.boot.actuate.endpoint.EndpointId;
|
||||||
|
@ -48,8 +47,6 @@ import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
|
||||||
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
|
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
||||||
import org.springframework.boot.actuate.endpoint.web.WebServerNamespace;
|
import org.springframework.boot.actuate.endpoint.web.WebServerNamespace;
|
||||||
import org.springframework.boot.actuate.endpoint.web.jersey.JerseyEndpointResourceFactory;
|
|
||||||
import org.springframework.boot.actuate.endpoint.web.jersey.JerseyHealthEndpointAdditionalPathResourceFactory;
|
|
||||||
import org.springframework.boot.actuate.health.HealthEndpoint;
|
import org.springframework.boot.actuate.health.HealthEndpoint;
|
||||||
import org.springframework.boot.actuate.health.HealthEndpointGroups;
|
import org.springframework.boot.actuate.health.HealthEndpointGroups;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
|
@ -57,6 +54,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.ManagementContextResourceConfigCustomizer;
|
||||||
|
import org.springframework.boot.jersey.actuate.endpoint.web.JerseyEndpointResourceFactory;
|
||||||
|
import org.springframework.boot.jersey.actuate.endpoint.web.JerseyHealthEndpointAdditionalPathResourceFactory;
|
||||||
import org.springframework.boot.jersey.autoconfigure.ResourceConfigCustomizer;
|
import org.springframework.boot.jersey.autoconfigure.ResourceConfigCustomizer;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
|
@ -17,4 +17,4 @@
|
||||||
/**
|
/**
|
||||||
* Auto-configuration for exposing actuator web endpoints using Jersey.
|
* Auto-configuration for exposing actuator web endpoints using Jersey.
|
||||||
*/
|
*/
|
||||||
package org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web;
|
|
@ -0,0 +1,147 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-present the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.jersey.actuate.autoconfigure.health;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
|
import org.glassfish.jersey.server.model.Resource;
|
||||||
|
import org.glassfish.jersey.servlet.ServletContainer;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.ObjectProvider;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
|
||||||
|
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
|
||||||
|
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
|
||||||
|
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
||||||
|
import org.springframework.boot.actuate.endpoint.web.WebServerNamespace;
|
||||||
|
import org.springframework.boot.actuate.health.HealthEndpoint;
|
||||||
|
import org.springframework.boot.actuate.health.HealthEndpointGroups;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.boot.jersey.actuate.endpoint.web.JerseyHealthEndpointAdditionalPathResourceFactory;
|
||||||
|
import org.springframework.boot.jersey.autoconfigure.DefaultJerseyApplicationPath;
|
||||||
|
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
||||||
|
import org.springframework.boot.jersey.autoconfigure.JerseyProperties;
|
||||||
|
import org.springframework.boot.jersey.autoconfigure.ResourceConfigCustomizer;
|
||||||
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-Configuration for {@link HealthEndpoint} Jersey extension.
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
* @author Madhura Bhave
|
||||||
|
* @since 4.0.0
|
||||||
|
* @see HealthEndpointAutoConfiguration
|
||||||
|
*/
|
||||||
|
@AutoConfiguration
|
||||||
|
@ConditionalOnWebApplication(type = Type.SERVLET)
|
||||||
|
@ConditionalOnBean(HealthEndpoint.class)
|
||||||
|
@ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class, exposure = EndpointExposure.WEB)
|
||||||
|
@ConditionalOnMissingClass("org.springframework.web.servlet.DispatcherServlet")
|
||||||
|
public class HealthEndpointJerseyExtensionAutoConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
JerseyAdditionalHealthEndpointPathsResourcesRegistrar jerseyAdditionalHealthEndpointPathsResourcesRegistrar(
|
||||||
|
WebEndpointsSupplier webEndpointsSupplier, HealthEndpointGroups healthEndpointGroups) {
|
||||||
|
ExposableWebEndpoint health = getHealthEndpoint(webEndpointsSupplier);
|
||||||
|
return new JerseyAdditionalHealthEndpointPathsResourcesRegistrar(health, healthEndpointGroups);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExposableWebEndpoint getHealthEndpoint(WebEndpointsSupplier webEndpointsSupplier) {
|
||||||
|
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
|
||||||
|
return webEndpoints.stream()
|
||||||
|
.filter((endpoint) -> endpoint.getEndpointId().equals(HealthEndpoint.ID))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
@ConditionalOnMissingBean(ResourceConfig.class)
|
||||||
|
@EnableConfigurationProperties(JerseyProperties.class)
|
||||||
|
static class JerseyInfrastructureConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
JerseyApplicationPath jerseyApplicationPath(JerseyProperties properties, ResourceConfig config) {
|
||||||
|
return new DefaultJerseyApplicationPath(properties.getApplicationPath(), config);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ResourceConfig resourceConfig(ObjectProvider<ResourceConfigCustomizer> resourceConfigCustomizers) {
|
||||||
|
ResourceConfig resourceConfig = new ResourceConfig();
|
||||||
|
resourceConfigCustomizers.orderedStream().forEach((customizer) -> customizer.customize(resourceConfig));
|
||||||
|
return resourceConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ServletRegistrationBean<ServletContainer> jerseyServletRegistration(JerseyApplicationPath jerseyApplicationPath,
|
||||||
|
ResourceConfig resourceConfig) {
|
||||||
|
return new ServletRegistrationBean<>(new ServletContainer(resourceConfig),
|
||||||
|
jerseyApplicationPath.getUrlMapping());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class JerseyAdditionalHealthEndpointPathsResourcesRegistrar implements ResourceConfigCustomizer {
|
||||||
|
|
||||||
|
private final ExposableWebEndpoint endpoint;
|
||||||
|
|
||||||
|
private final HealthEndpointGroups groups;
|
||||||
|
|
||||||
|
JerseyAdditionalHealthEndpointPathsResourcesRegistrar(ExposableWebEndpoint endpoint,
|
||||||
|
HealthEndpointGroups groups) {
|
||||||
|
this.endpoint = endpoint;
|
||||||
|
this.groups = groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void customize(ResourceConfig config) {
|
||||||
|
register(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void register(ResourceConfig config) {
|
||||||
|
EndpointMapping mapping = new EndpointMapping("");
|
||||||
|
JerseyHealthEndpointAdditionalPathResourceFactory resourceFactory = new JerseyHealthEndpointAdditionalPathResourceFactory(
|
||||||
|
WebServerNamespace.SERVER, this.groups);
|
||||||
|
Collection<Resource> endpointResources = resourceFactory
|
||||||
|
.createEndpointResources(mapping,
|
||||||
|
(this.endpoint != null) ? Collections.singletonList(this.endpoint) : Collections.emptyList())
|
||||||
|
.stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.toList();
|
||||||
|
register(endpointResources, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void register(Collection<Resource> resources, ResourceConfig config) {
|
||||||
|
config.registerResources(new HashSet<>(resources));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-present the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-configuration for actuator health concerns.
|
||||||
|
*/
|
||||||
|
package org.springframework.boot.jersey.actuate.autoconfigure.health;
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.web;
|
||||||
|
|
||||||
import org.glassfish.jersey.server.ResourceConfig;
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.web;
|
||||||
|
|
||||||
import org.glassfish.jersey.server.ResourceConfig;
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
import org.glassfish.jersey.servlet.ServletContainer;
|
import org.glassfish.jersey.servlet.ServletContainer;
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.web;
|
||||||
|
|
||||||
import org.glassfish.jersey.server.ResourceConfig;
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.web;
|
||||||
|
|
||||||
import org.glassfish.jersey.server.ResourceConfig;
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ import org.glassfish.jersey.server.ResourceConfig;
|
||||||
* {@link ResourceConfig} in the management context before it is used.
|
* {@link ResourceConfig} in the management context before it is used.
|
||||||
*
|
*
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
* @since 2.3.10
|
* @since 4.0.0
|
||||||
*/
|
*/
|
||||||
public interface ManagementContextResourceConfigCustomizer {
|
public interface ManagementContextResourceConfigCustomizer {
|
||||||
|
|
|
@ -17,4 +17,4 @@
|
||||||
/**
|
/**
|
||||||
* Configuration for a Jersey-based management context.
|
* Configuration for a Jersey-based management context.
|
||||||
*/
|
*/
|
||||||
package org.springframework.boot.actuate.autoconfigure.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.web;
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.endpoint.web;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.endpoint.web;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.endpoint.web;
|
||||||
|
|
||||||
import jakarta.ws.rs.container.ContainerRequestContext;
|
import jakarta.ws.rs.container.ContainerRequestContext;
|
||||||
|
|
|
@ -17,4 +17,4 @@
|
||||||
/**
|
/**
|
||||||
* Jersey support for actuator endpoints.
|
* Jersey support for actuator endpoints.
|
||||||
*/
|
*/
|
||||||
package org.springframework.boot.actuate.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.endpoint.web;
|
|
@ -0,0 +1,5 @@
|
||||||
|
org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web.JerseyEndpointManagementContextConfiguration
|
||||||
|
org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web.JerseyWebEndpointManagementContextConfiguration
|
||||||
|
org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration
|
||||||
|
org.springframework.boot.jersey.actuate.autoconfigure.web.JerseyChildManagementContextConfiguration
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
|
org.springframework.boot.jersey.actuate.autoconfigure.health.HealthEndpointJerseyExtensionAutoConfiguration
|
||||||
org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration
|
org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration
|
||||||
|
|
|
@ -14,47 +14,44 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.endpoint.web;
|
package org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
|
||||||
import org.springframework.boot.actuate.endpoint.Access;
|
import org.springframework.boot.actuate.endpoint.Access;
|
||||||
import org.springframework.boot.actuate.endpoint.EndpointAccessResolver;
|
import org.springframework.boot.actuate.endpoint.EndpointAccessResolver;
|
||||||
import org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar;
|
import org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar;
|
||||||
import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
|
import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
|
||||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||||
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.web.servlet.DispatcherServlet;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link ServletEndpointManagementContextConfiguration}.
|
* Tests for {@link JerseyEndpointManagementContextConfiguration}.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Stephane Nicoll
|
||||||
* @author Madhura Bhave
|
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("removal")
|
@SuppressWarnings("removal")
|
||||||
class ServletEndpointManagementContextConfigurationTests {
|
class JerseyEndpointManagementContextConfigurationTests {
|
||||||
|
|
||||||
private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
|
private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
|
||||||
.withUserConfiguration(TestConfig.class);
|
.withUserConfiguration(TestConfig.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void contextWhenJerseyShouldContainServletEndpointRegistrar() {
|
void contextShouldContainServletEndpointRegistrar() {
|
||||||
FilteredClassLoader classLoader = new FilteredClassLoader(DispatcherServlet.class);
|
this.contextRunner.run((context) -> {
|
||||||
this.contextRunner.withClassLoader(classLoader).run((context) -> {
|
|
||||||
assertThat(context).hasSingleBean(ServletEndpointRegistrar.class);
|
assertThat(context).hasSingleBean(ServletEndpointRegistrar.class);
|
||||||
ServletEndpointRegistrar bean = context.getBean(ServletEndpointRegistrar.class);
|
ServletEndpointRegistrar bean = context.getBean(ServletEndpointRegistrar.class);
|
||||||
assertThat(bean).hasFieldOrPropertyWithValue("basePath", "/jersey/actuator");
|
assertThat(bean).hasFieldOrPropertyWithValue("basePath", "/test/actuator");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +62,7 @@ class ServletEndpointManagementContextConfigurationTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@Import(ServletEndpointManagementContextConfiguration.class)
|
@Import(JerseyEndpointManagementContextConfiguration.class)
|
||||||
@EnableConfigurationProperties(WebEndpointProperties.class)
|
@EnableConfigurationProperties(WebEndpointProperties.class)
|
||||||
static class TestConfig {
|
static class TestConfig {
|
||||||
|
|
||||||
|
@ -76,7 +73,7 @@ class ServletEndpointManagementContextConfigurationTests {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
JerseyApplicationPath jerseyApplicationPath() {
|
JerseyApplicationPath jerseyApplicationPath() {
|
||||||
return () -> "/jersey";
|
return () -> "/test";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -24,16 +24,14 @@ import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration;
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration;
|
||||||
import org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration;
|
import org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
|
||||||
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
||||||
import org.springframework.boot.tomcat.autoconfigure.servlet.TomcatServletWebServerAutoConfiguration;
|
import org.springframework.boot.tomcat.autoconfigure.servlet.TomcatServletWebServerAutoConfiguration;
|
||||||
import org.springframework.boot.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext;
|
import org.springframework.boot.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.servlet.DispatcherServlet;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
@ -52,7 +50,6 @@ class JerseyWebEndpointIntegrationTests {
|
||||||
TomcatServletWebServerAutoConfiguration.class, EndpointAutoConfiguration.class,
|
TomcatServletWebServerAutoConfiguration.class, EndpointAutoConfiguration.class,
|
||||||
WebEndpointAutoConfiguration.class, JerseyWebEndpointManagementContextConfiguration.class))
|
WebEndpointAutoConfiguration.class, JerseyWebEndpointManagementContextConfiguration.class))
|
||||||
.withUserConfiguration(ResourceConfigConfiguration.class)
|
.withUserConfiguration(ResourceConfigConfiguration.class)
|
||||||
.withClassLoader(new FilteredClassLoader(DispatcherServlet.class))
|
|
||||||
.withPropertyValues("spring.jersey.type=filter", "server.port=0")
|
.withPropertyValues("spring.jersey.type=filter", "server.port=0")
|
||||||
.run((context) -> {
|
.run((context) -> {
|
||||||
assertThat(context).hasNotFailed();
|
assertThat(context).hasNotFailed();
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey;
|
package org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
@ -22,12 +22,12 @@ import org.glassfish.jersey.server.ResourceConfig;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey.JerseyWebEndpointManagementContextConfiguration.JerseyWebEndpointsResourcesRegistrar;
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration;
|
|
||||||
import org.springframework.boot.actuate.endpoint.Access;
|
import org.springframework.boot.actuate.endpoint.Access;
|
||||||
import org.springframework.boot.actuate.endpoint.EndpointAccessResolver;
|
import org.springframework.boot.actuate.endpoint.EndpointAccessResolver;
|
||||||
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.endpoint.web.JerseyWebEndpointManagementContextConfiguration.JerseyWebEndpointsResourcesRegistrar;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||||
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-present the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.jersey.actuate.autoconfigure.health;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.WithTestEndpointOutcomeExposureContributor;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
|
||||||
|
import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier;
|
||||||
|
import org.springframework.boot.actuate.health.Health;
|
||||||
|
import org.springframework.boot.actuate.health.HealthEndpoint;
|
||||||
|
import org.springframework.boot.actuate.health.HealthEndpointWebExtension;
|
||||||
|
import org.springframework.boot.actuate.health.HealthIndicator;
|
||||||
|
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||||
|
import org.springframework.boot.jersey.actuate.autoconfigure.health.HealthEndpointJerseyExtensionAutoConfiguration.JerseyAdditionalHealthEndpointPathsResourcesRegistrar;
|
||||||
|
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link HealthEndpointJerseyExtensionAutoConfiguration}.
|
||||||
|
*
|
||||||
|
* @author Stephane Nicoll
|
||||||
|
*/
|
||||||
|
class HealthEndpointJerseyExtensionAutoConfigurationTests {
|
||||||
|
|
||||||
|
private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
|
||||||
|
.withUserConfiguration(HealthIndicatorsConfiguration.class)
|
||||||
|
.withConfiguration(AutoConfigurations.of(HealthContributorAutoConfiguration.class,
|
||||||
|
HealthEndpointAutoConfiguration.class, HealthEndpointJerseyExtensionAutoConfiguration.class));
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@WithTestEndpointOutcomeExposureContributor
|
||||||
|
void additionalJerseyHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
|
||||||
|
this.contextRunner
|
||||||
|
.withConfiguration(
|
||||||
|
AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
|
||||||
|
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
|
||||||
|
"management.endpoints.test.exposure.include=*")
|
||||||
|
.run((context) -> {
|
||||||
|
assertThat(context).hasNotFailed();
|
||||||
|
assertThat(context).hasSingleBean(HealthEndpoint.class);
|
||||||
|
assertThat(context).hasSingleBean(HealthEndpointWebExtension.class);
|
||||||
|
assertThat(context.getBean(WebEndpointsSupplier.class).getEndpoints()).isEmpty();
|
||||||
|
assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsResourcesRegistrar.class);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
static class HealthIndicatorsConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
HealthIndicator simpleHealthIndicator() {
|
||||||
|
return () -> Health.up().withDetail("counter", 42).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
HealthIndicator additionalHealthIndicator() {
|
||||||
|
return () -> Health.up().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ReactiveHealthIndicator reactiveHealthIndicator() {
|
||||||
|
return () -> Mono.just(Health.up().build());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue