From ea9897da22c44fd77f54825675577762c464341e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Thu, 22 May 2025 10:20:34 +0200 Subject: [PATCH] Move Actuator Jersey infrastructure to spring-boot-jersey See gh-46116 --- ...web.ManagementContextConfiguration.imports | 3 - ...ndpointAdditionalPathIntegrationTests.java | 2 + ...ldManagementContextConfigurationTests.java | 3 + ...meManagementContextConfigurationTests.java | 2 + ...ntextConfigurationImportSelectorTests.java | 2 +- .../build.gradle | 6 +- ...ndpointManagementContextConfiguration.java | 25 --- ...althEndpointWebExtensionConfiguration.java | 95 ----------- .../HealthEndpointAutoConfigurationTests.java | 20 --- ...estEndpointOutcomeExposureContributor.java | 0 .../JerseyWebEndpointIntegrationTests.java | 1 + ...EndpointTestInvocationContextProvider.java | 2 +- .../spring-boot-actuator/build.gradle | 4 - .../spring-boot-jersey/build.gradle | 3 + ...ndpointManagementContextConfiguration.java | 53 +++++++ ...ndpointManagementContextConfiguration.java | 8 +- .../endpoint/web}/package-info.java | 2 +- ...pointJerseyExtensionAutoConfiguration.java | 147 ++++++++++++++++++ .../autoconfigure/health/package-info.java | 20 +++ ...eyChildManagementContextConfiguration.java | 2 +- .../JerseyManagementContextConfiguration.java | 2 +- ...seySameManagementContextConfiguration.java | 2 +- ...gementContextResourceConfigCustomizer.java | 4 +- .../autoconfigure/web}/package-info.java | 2 +- .../web}/JerseyEndpointResourceFactory.java | 2 +- ...EndpointAdditionalPathResourceFactory.java | 2 +- .../JerseyRemainingPathSegmentProvider.java | 2 +- .../actuate/endpoint/web}/package-info.java | 2 +- ...web.ManagementContextConfiguration.imports | 5 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + ...tManagementContextConfigurationTests.java} | 23 ++- .../JerseyWebEndpointIntegrationTests.java | 7 +- ...ntManagementContextConfigurationTests.java | 6 +- ...JerseyExtensionAutoConfigurationTests.java | 90 +++++++++++ 34 files changed, 363 insertions(+), 187 deletions(-) rename spring-boot-project/spring-boot-actuator-autoconfigure/src/{test => testFixtures}/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/WithTestEndpointOutcomeExposureContributor.java (100%) create mode 100644 spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfiguration.java rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web}/JerseyWebEndpointManagementContextConfiguration.java (97%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web}/package-info.java (90%) create mode 100644 spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfiguration.java create mode 100644 spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/package-info.java rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web}/JerseyChildManagementContextConfiguration.java (97%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web}/JerseyManagementContextConfiguration.java (95%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web}/JerseySameManagementContextConfiguration.java (98%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web}/ManagementContextResourceConfigCustomizer.java (92%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web}/package-info.java (91%) rename spring-boot-project/{spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web}/JerseyEndpointResourceFactory.java (99%) rename spring-boot-project/{spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web}/JerseyHealthEndpointAdditionalPathResourceFactory.java (98%) rename spring-boot-project/{spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web}/JerseyRemainingPathSegmentProvider.java (93%) rename spring-boot-project/{spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey => spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web}/package-info.java (91%) create mode 100644 spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports rename spring-boot-project/{spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfigurationTests.java => spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfigurationTests.java} (77%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey => spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web}/JerseyWebEndpointIntegrationTests.java (89%) rename spring-boot-project/{spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey => spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web}/JerseyWebEndpointManagementContextConfigurationTests.java (91%) create mode 100644 spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfigurationTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports index 42dd4f7b0b0..08f6b28f6e3 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports +++ b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports @@ -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.servlet.WebMvcEndpointManagementContextConfiguration 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.server.jetty.JettyReactiveManagementChildContextConfiguration org.springframework.boot.actuate.autoconfigure.web.server.jetty.JettyServletManagementChildContextConfiguration diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/JerseyHealthEndpointAdditionalPathIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/JerseyHealthEndpointAdditionalPathIntegrationTests.java index 0270c797baa..5ba39132840 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/JerseyHealthEndpointAdditionalPathIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/JerseyHealthEndpointAdditionalPathIntegrationTests.java @@ -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.autoconfigure.AutoConfigurations; 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.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; @@ -50,6 +51,7 @@ class JerseyHealthEndpointAdditionalPathIntegrationTests extends TomcatServletManagementContextAutoConfiguration.class, WebEndpointAutoConfiguration.class, JerseyAutoConfiguration.class, ManagementContextAutoConfiguration.class, ServletManagementContextAutoConfiguration.class, HealthEndpointAutoConfiguration.class, + HealthEndpointJerseyExtensionAutoConfiguration.class, DiskSpaceHealthContributorAutoConfiguration.class)) .withInitializer(new ServerPortInfoApplicationContextInitializer()) .withClassLoader(new FilteredClassLoader(DispatcherServlet.class)) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfigurationTests.java index f5b74756751..efc213ef838 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfigurationTests.java @@ -21,6 +21,9 @@ import org.glassfish.jersey.servlet.ServletContainer; import org.junit.jupiter.api.Test; 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.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfigurationTests.java index 0175e6210a7..0e5cabffb0c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfigurationTests.java @@ -21,6 +21,8 @@ import org.glassfish.jersey.servlet.ServletContainer; import org.junit.jupiter.api.Test; 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.JerseyApplicationPath; import org.springframework.boot.test.context.FilteredClassLoader; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementContextConfigurationImportSelectorTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementContextConfigurationImportSelectorTests.java index 2568d2b0a75..0faed22268f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementContextConfigurationImportSelectorTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/web/server/ManagementContextConfigurationImportSelectorTests.java @@ -74,7 +74,7 @@ class ManagementContextConfigurationImportSelectorTests { // Remove JerseySameManagementContextConfiguration, as it specifies // ManagementContextType.SAME and we asked for ManagementContextType.CHILD expected.remove( - "org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration"); + "org.springframework.boot.jersey.actuate.autoconfigure.web.JerseySameManagementContextConfiguration"); assertThat(imports).containsExactlyInAnyOrderElementsOf(expected); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle index b5a8169211f..688c9d19c8d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle @@ -16,6 +16,7 @@ plugins { id "java-library" + id "java-test-fixtures" id "org.springframework.boot.auto-configuration" id "org.springframework.boot.configuration-properties" id "org.springframework.boot.deployed" @@ -27,17 +28,18 @@ description = "Spring Boot Actuator AutoConfigure" dependencies { api(project(":spring-boot-project:spring-boot-actuator")) 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-web-server")) + optional("com.fasterxml.jackson.core:jackson-databind") optional("io.micrometer:micrometer-core") optional("io.projectreactor:reactor-core") optional("jakarta.servlet:jakarta.servlet-api") optional("org.springframework:spring-webmvc") 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-tools:spring-boot-test-support")) testImplementation("org.springframework:spring-web") diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration.java index 13584675398..5a62810b4ca 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration.java @@ -16,18 +16,11 @@ 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.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.Type; -import org.springframework.boot.jersey.autoconfigure.JerseyApplicationPath; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; /** * {@link ManagementContextConfiguration @ManagementContextConfiguration} for servlet @@ -52,22 +45,4 @@ public class ServletEndpointManagementContextConfiguration { 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); - } - - } - } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointWebExtensionConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointWebExtensionConfiguration.java index 0262598df11..1cb0b4e5d1c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointWebExtensionConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointWebExtensionConfiguration.java @@ -17,39 +17,21 @@ package org.springframework.boot.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.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.endpoint.web.jersey.JerseyHealthEndpointAdditionalPathResourceFactory; import org.springframework.boot.actuate.endpoint.web.servlet.AdditionalHealthEndpointPathsWebMvcHandlerMapping; import org.springframework.boot.actuate.health.HealthContributorRegistry; import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.actuate.health.HealthEndpointGroups; import org.springframework.boot.actuate.health.HealthEndpointWebExtension; 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.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.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; 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 resourceConfigCustomizers) { - ResourceConfig resourceConfig = new ResourceConfig(); - resourceConfigCustomizers.orderedStream().forEach((customizer) -> customizer.customize(resourceConfig)); - return resourceConfig; - } - - @Bean - ServletRegistrationBean 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 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 resources, ResourceConfig config) { - config.registerResources(new HashSet<>(resources)); - } - - } - } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java index 76f51b76095..b2652fa45f1 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java @@ -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.health.HealthEndpointConfiguration.HealthEndpointGroupMembershipValidator.NoSuchHealthContributorException; 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.endpoint.ApiVersion; 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 @WithTestEndpointOutcomeExposureContributor void additionalReactiveHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/WithTestEndpointOutcomeExposureContributor.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/testFixtures/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/WithTestEndpointOutcomeExposureContributor.java similarity index 100% rename from spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/WithTestEndpointOutcomeExposureContributor.java rename to spring-boot-project/spring-boot-actuator-autoconfigure/src/testFixtures/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/WithTestEndpointOutcomeExposureContributor.java diff --git a/spring-boot-project/spring-boot-actuator-integration-tests/src/test/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java b/spring-boot-project/spring-boot-actuator-integration-tests/src/test/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java index f6f5a726c9b..42e73b807d7 100644 --- a/spring-boot-project/spring-boot-actuator-integration-tests/src/test/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-integration-tests/src/test/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java @@ -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.annotation.AbstractWebEndpointIntegrationTests; 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.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext; import org.springframework.boot.web.servlet.ServletRegistrationBean; diff --git a/spring-boot-project/spring-boot-actuator-test-support/src/main/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java b/spring-boot-project/spring-boot-actuator-test-support/src/main/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java index d7caa18f72c..a52910d8d8a 100644 --- a/spring-boot-project/spring-boot-actuator-test-support/src/main/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java +++ b/spring-boot-project/spring-boot-actuator-test-support/src/main/java/org/springframework/boot/actuate/endpoint/web/test/WebEndpointTestInvocationContextProvider.java @@ -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.EndpointMediaTypes; 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.servlet.WebMvcEndpointHandlerMapping; import org.springframework.boot.actuate.endpoint.web.test.WebEndpointTest.Infrastructure; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration; 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.ResourceConfigCustomizer; import org.springframework.boot.reactor.netty.NettyReactiveWebServerFactory; diff --git a/spring-boot-project/spring-boot-actuator/build.gradle b/spring-boot-project/spring-boot-actuator/build.gradle index 7fee036ccc2..8798c98da0b 100644 --- a/spring-boot-project/spring-boot-actuator/build.gradle +++ b/spring-boot-project/spring-boot-actuator/build.gradle @@ -48,8 +48,6 @@ dependencies { optional("org.apache.tomcat.embed:tomcat-embed-core") optional("org.aspectj:aspectjweaver") 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.influxdb:influxdb-java") optional("org.springframework:spring-context-support") @@ -73,13 +71,11 @@ dependencies { testImplementation("io.projectreactor:reactor-test") testImplementation("net.minidev:json-smart") 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("ch.qos.logback:logback-classic") testRuntimeOnly("io.projectreactor.netty:reactor-netty-http") testRuntimeOnly("jakarta.xml.bind:jakarta.xml.bind-api") testRuntimeOnly("org.apache.tomcat.embed:tomcat-embed-el") - testRuntimeOnly("org.glassfish.jersey.ext:jersey-spring6") testRuntimeOnly("org.hsqldb:hsqldb") } diff --git a/spring-boot-project/spring-boot-jersey/build.gradle b/spring-boot-project/spring-boot-jersey/build.gradle index eb1d2678fd5..38896603538 100644 --- a/spring-boot-project/spring-boot-jersey/build.gradle +++ b/spring-boot-project/spring-boot-jersey/build.gradle @@ -36,14 +36,17 @@ dependencies { 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-jackson")) + optional("io.projectreactor:reactor-core") testImplementation(project(":spring-boot-project:spring-boot-restclient")) testImplementation(project(":spring-boot-project:spring-boot-test")) 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-web-server-test")) + testImplementation(testFixtures(project(":spring-boot-project:spring-boot-actuator-autoconfigure"))) testImplementation("jakarta.servlet:jakarta.servlet-api") testRuntimeOnly("ch.qos.logback:logback-classic") diff --git a/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfiguration.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfiguration.java new file mode 100644 index 00000000000..e8ab0a46f2f --- /dev/null +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfiguration.java @@ -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); + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointManagementContextConfiguration.java similarity index 97% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointManagementContextConfiguration.java index 719108f8f89..a8d1bc4224a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointManagementContextConfiguration.java @@ -14,7 +14,7 @@ * 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.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.web.WebEndpointProperties; 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.ManagementPortType; 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.WebEndpointsSupplier; 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.HealthEndpointGroups; 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.ConditionalOnWebApplication; 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.context.annotation.Bean; import org.springframework.core.env.Environment; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/package-info.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/package-info.java similarity index 90% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/package-info.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/package-info.java index 45674ea419f..c8e02eb233f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/package-info.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/package-info.java @@ -17,4 +17,4 @@ /** * 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; diff --git a/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfiguration.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfiguration.java new file mode 100644 index 00000000000..8d8cfa5ec18 --- /dev/null +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfiguration.java @@ -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 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 resourceConfigCustomizers) { + ResourceConfig resourceConfig = new ResourceConfig(); + resourceConfigCustomizers.orderedStream().forEach((customizer) -> customizer.customize(resourceConfig)); + return resourceConfig; + } + + @Bean + ServletRegistrationBean 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 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 resources, ResourceConfig config) { + config.registerResources(new HashSet<>(resources)); + } + + } + +} diff --git a/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/package-info.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/package-info.java new file mode 100644 index 00000000000..f738c85838e --- /dev/null +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/health/package-info.java @@ -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; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfiguration.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseyChildManagementContextConfiguration.java similarity index 97% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfiguration.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseyChildManagementContextConfiguration.java index 07be53a998b..b7eb89be060 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyChildManagementContextConfiguration.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseyChildManagementContextConfiguration.java @@ -14,7 +14,7 @@ * 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; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementContextConfiguration.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseyManagementContextConfiguration.java similarity index 95% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementContextConfiguration.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseyManagementContextConfiguration.java index d0de97b3e6e..126e7f9ad64 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementContextConfiguration.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseyManagementContextConfiguration.java @@ -14,7 +14,7 @@ * 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.servlet.ServletContainer; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfiguration.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseySameManagementContextConfiguration.java similarity index 98% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfiguration.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseySameManagementContextConfiguration.java index 2116e002352..6151c876956 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseySameManagementContextConfiguration.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/JerseySameManagementContextConfiguration.java @@ -14,7 +14,7 @@ * 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; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/ManagementContextResourceConfigCustomizer.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/ManagementContextResourceConfigCustomizer.java similarity index 92% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/ManagementContextResourceConfigCustomizer.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/ManagementContextResourceConfigCustomizer.java index d98705d5fef..7c03bac5f90 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/ManagementContextResourceConfigCustomizer.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/ManagementContextResourceConfigCustomizer.java @@ -14,7 +14,7 @@ * 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; @@ -23,7 +23,7 @@ import org.glassfish.jersey.server.ResourceConfig; * {@link ResourceConfig} in the management context before it is used. * * @author Andy Wilkinson - * @since 2.3.10 + * @since 4.0.0 */ public interface ManagementContextResourceConfigCustomizer { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/package-info.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/package-info.java similarity index 91% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/package-info.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/package-info.java index 21fd5ad7629..37dae2ccc03 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/package-info.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/autoconfigure/web/package-info.java @@ -17,4 +17,4 @@ /** * Configuration for a Jersey-based management context. */ -package org.springframework.boot.actuate.autoconfigure.web.jersey; +package org.springframework.boot.jersey.actuate.autoconfigure.web; diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyEndpointResourceFactory.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyEndpointResourceFactory.java similarity index 99% rename from spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyEndpointResourceFactory.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyEndpointResourceFactory.java index af162d97ee1..5c035c1c617 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyEndpointResourceFactory.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyEndpointResourceFactory.java @@ -14,7 +14,7 @@ * 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.InputStream; diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyHealthEndpointAdditionalPathResourceFactory.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyHealthEndpointAdditionalPathResourceFactory.java similarity index 98% rename from spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyHealthEndpointAdditionalPathResourceFactory.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyHealthEndpointAdditionalPathResourceFactory.java index daa4407506d..a0cb753591c 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyHealthEndpointAdditionalPathResourceFactory.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyHealthEndpointAdditionalPathResourceFactory.java @@ -14,7 +14,7 @@ * 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.Collection; diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyRemainingPathSegmentProvider.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyRemainingPathSegmentProvider.java similarity index 93% rename from spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyRemainingPathSegmentProvider.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyRemainingPathSegmentProvider.java index 3c52e0480b7..90a2704f10e 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyRemainingPathSegmentProvider.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/JerseyRemainingPathSegmentProvider.java @@ -14,7 +14,7 @@ * 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; diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/package-info.java b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/package-info.java similarity index 91% rename from spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/package-info.java rename to spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/package-info.java index 272e4590b93..f32934da0f6 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/package-info.java +++ b/spring-boot-project/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/actuate/endpoint/web/package-info.java @@ -17,4 +17,4 @@ /** * Jersey support for actuator endpoints. */ -package org.springframework.boot.actuate.endpoint.web.jersey; +package org.springframework.boot.jersey.actuate.endpoint.web; diff --git a/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports b/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports new file mode 100644 index 00000000000..de48d814dc1 --- /dev/null +++ b/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports @@ -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 + diff --git a/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 184bb7359ea..754936f4aa8 100644 --- a/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-boot-project/spring-boot-jersey/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ +org.springframework.boot.jersey.actuate.autoconfigure.health.HealthEndpointJerseyExtensionAutoConfiguration org.springframework.boot.jersey.autoconfigure.JerseyAutoConfiguration diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfigurationTests.java b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfigurationTests.java similarity index 77% rename from spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfigurationTests.java rename to spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfigurationTests.java index 50224da8cc8..c9b23a4bf3a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfigurationTests.java +++ b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyEndpointManagementContextConfigurationTests.java @@ -14,47 +14,44 @@ * 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 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.EndpointAccessResolver; import org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar; import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; import org.springframework.boot.context.properties.EnableConfigurationProperties; 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.WebApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.DispatcherServlet; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link ServletEndpointManagementContextConfiguration}. + * Tests for {@link JerseyEndpointManagementContextConfiguration}. * - * @author Phillip Webb - * @author Madhura Bhave + * @author Stephane Nicoll */ @SuppressWarnings("removal") -class ServletEndpointManagementContextConfigurationTests { +class JerseyEndpointManagementContextConfigurationTests { private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() .withUserConfiguration(TestConfig.class); @Test - void contextWhenJerseyShouldContainServletEndpointRegistrar() { - FilteredClassLoader classLoader = new FilteredClassLoader(DispatcherServlet.class); - this.contextRunner.withClassLoader(classLoader).run((context) -> { + void contextShouldContainServletEndpointRegistrar() { + this.contextRunner.run((context) -> { assertThat(context).hasSingleBean(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) - @Import(ServletEndpointManagementContextConfiguration.class) + @Import(JerseyEndpointManagementContextConfiguration.class) @EnableConfigurationProperties(WebEndpointProperties.class) static class TestConfig { @@ -76,7 +73,7 @@ class ServletEndpointManagementContextConfigurationTests { @Bean JerseyApplicationPath jerseyApplicationPath() { - return () -> "/jersey"; + return () -> "/test"; } @Bean diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointIntegrationTests.java similarity index 89% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java rename to spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointIntegrationTests.java index b8760d6211a..35662bcbed6 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointIntegrationTests.java +++ b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointIntegrationTests.java @@ -14,7 +14,7 @@ * 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; @@ -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.web.WebEndpointAutoConfiguration; -import org.springframework.boot.actuate.autoconfigure.web.jersey.JerseySameManagementContextConfiguration; 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.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.tomcat.autoconfigure.servlet.TomcatServletWebServerAutoConfiguration; import org.springframework.boot.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.DispatcherServlet; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +50,6 @@ class JerseyWebEndpointIntegrationTests { TomcatServletWebServerAutoConfiguration.class, EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class, JerseyWebEndpointManagementContextConfiguration.class)) .withUserConfiguration(ResourceConfigConfiguration.class) - .withClassLoader(new FilteredClassLoader(DispatcherServlet.class)) .withPropertyValues("spring.jersey.type=filter", "server.port=0") .run((context) -> { assertThat(context).hasNotFailed(); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfigurationTests.java b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointManagementContextConfigurationTests.java similarity index 91% rename from spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfigurationTests.java rename to spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointManagementContextConfigurationTests.java index a1960b85af9..51b37d9b65f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure-all/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfigurationTests.java +++ b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/endpoint/web/JerseyWebEndpointManagementContextConfigurationTests.java @@ -14,7 +14,7 @@ * 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; @@ -22,12 +22,12 @@ import org.glassfish.jersey.server.ResourceConfig; import org.junit.jupiter.api.Test; 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.EndpointAccessResolver; import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; 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.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; diff --git a/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfigurationTests.java b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfigurationTests.java new file mode 100644 index 00000000000..aa3d232d872 --- /dev/null +++ b/spring-boot-project/spring-boot-jersey/src/test/java/org/springframework/boot/jersey/actuate/autoconfigure/health/HealthEndpointJerseyExtensionAutoConfigurationTests.java @@ -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()); + } + + } + +}