diff --git a/api-catalog-services/build.gradle b/api-catalog-services/build.gradle
index 07a1781f1a..c7dcb732dd 100644
--- a/api-catalog-services/build.gradle
+++ b/api-catalog-services/build.gradle
@@ -65,7 +65,7 @@ dependencies {
api project(':apiml-tomcat-common')
api project(':security-service-client-spring')
- implementation libs.spring.boot.starter.aop
+ implementation libs.spring.boot.starter.aspectj
implementation libs.spring.boot.starter.actuator
implementation libs.spring.boot.starter.security
implementation libs.spring.boot.starter.web
diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/ApiCatalogApplication.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/ApiCatalogApplication.java
index c67022bb94..03ef8f628c 100644
--- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/ApiCatalogApplication.java
+++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/ApiCatalogApplication.java
@@ -11,8 +11,6 @@
package org.zowe.apiml.apicatalog;
import org.springframework.boot.SpringApplication;
-import org.springframework.boot.actuate.autoconfigure.logging.OpenTelemetryLoggingAutoConfiguration;
-import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
@@ -27,8 +25,6 @@
@SpringBootApplication(
exclude = {
- OpenTelemetryAutoConfiguration.class,
- OpenTelemetryLoggingAutoConfiguration.class
}
)
@EnableDiscoveryClient
diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/handlers/CustomErrorStatusHandlingBean.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/handlers/CustomErrorStatusHandlingBean.java
index e88d02cdda..e130aba6c4 100644
--- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/handlers/CustomErrorStatusHandlingBean.java
+++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/handlers/CustomErrorStatusHandlingBean.java
@@ -11,9 +11,9 @@
package org.zowe.apiml.apicatalog.controllers.handlers;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.web.server.ErrorPage;
+import org.springframework.boot.web.error.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
-import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
+import org.springframework.boot.web.server.servlet.ConfigurableServletWebServerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicator.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicator.java
index 78d799306b..43786b0ba0 100644
--- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicator.java
+++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicator.java
@@ -11,9 +11,9 @@
package org.zowe.apiml.apicatalog.health;
import lombok.RequiredArgsConstructor;
-import org.springframework.boot.actuate.health.AbstractHealthIndicator;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.Status;
+import org.springframework.boot.health.contributor.AbstractHealthIndicator;
+import org.springframework.boot.health.contributor.Health;
+import org.springframework.boot.health.contributor.Status;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicatorTest.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicatorTest.java
index 9a912316ba..e79cb29561 100644
--- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicatorTest.java
+++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/health/ApiCatalogHealthIndicatorTest.java
@@ -12,8 +12,8 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.Status;
+import org.springframework.boot.health.contributor.Health;
+import org.springframework.boot.health.contributor.Status;
import org.springframework.cloud.client.DefaultServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.zowe.apiml.product.constants.CoreService;
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/ApimlDiscoveryCompositeHealthContributor.java b/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/ApimlDiscoveryCompositeHealthContributor.java
deleted file mode 100644
index f1d17047e6..0000000000
--- a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/ApimlDiscoveryCompositeHealthContributor.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * This program and the accompanying materials are made available under the terms of the
- * Eclipse Public License v2.0 which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-v20.html
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Copyright Contributors to the Zowe Project.
- */
-
-package org.zowe.apiml.product.compatibility;
-
-import org.springframework.boot.actuate.health.CompositeHealthContributor;
-import org.springframework.boot.actuate.health.HealthContributor;
-import org.springframework.boot.actuate.health.HealthIndicator;
-import org.springframework.boot.actuate.health.NamedContributor;
-import org.springframework.cloud.client.discovery.health.DiscoveryHealthIndicator;
-import org.springframework.stereotype.Component;
-import org.springframework.util.Assert;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-/**
- * This class is a replacement for DiscoveryCompositeHealthContributor in spring-cloud-cloud-commons:2.2.9.RELEASE in order
- * to work with ApimlHealthCheckHandler more effectively.
- *
- * This code is copied from the 3.1.x version of spring-cloud-commons.
- * https://github.com/spring-cloud/spring-cloud-commons/blob/3.1.x/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthContributor.java
- *
- * NOTE: This should be removed when the APIML upgrades to Spring Cloud 3.x.
- */
-@Component
-public class ApimlDiscoveryCompositeHealthContributor implements CompositeHealthContributor {
- private final Map indicators;
-
- public ApimlDiscoveryCompositeHealthContributor(Collection indicators) {
- Assert.notNull(indicators, "'indicators' must not be null");
- this.indicators = indicators.stream()
- .collect(Collectors.toMap(DiscoveryHealthIndicator::getName, Function.identity()));
- }
-
- @Override
- public HealthContributor getContributor(String name) {
- return asHealthIndicator(this.indicators.get(name));
- }
-
- @Override
- public Iterator> iterator() {
- return this.indicators.values().stream().map(this::asNamedContributor).iterator();
- }
-
- private NamedContributor asNamedContributor(DiscoveryHealthIndicator indicator) {
- return new NamedContributor() {
-
- @Override
- public String getName() {
- return indicator.getName();
- }
-
- @Override
- public HealthIndicator getContributor() {
- return asHealthIndicator(indicator);
- }
-
- };
- }
-
- private HealthIndicator asHealthIndicator(DiscoveryHealthIndicator indicator) {
- return (indicator != null) ? indicator::health : null;
- }
-
- public Map getIndicators() {
- return Collections.unmodifiableMap(indicators);
- }
-}
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/ApimlHealthCheckHandler.java b/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/ApimlHealthCheckHandler.java
deleted file mode 100644
index fad6541859..0000000000
--- a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/ApimlHealthCheckHandler.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * This program and the accompanying materials are made available under the terms of the
- * Eclipse Public License v2.0 which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-v20.html
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Copyright Contributors to the Zowe Project.
- */
-
-package org.zowe.apiml.product.compatibility;
-
-import com.netflix.appinfo.HealthCheckHandler;
-import com.netflix.appinfo.InstanceInfo;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.boot.actuate.health.*;
-import org.springframework.cloud.netflix.eureka.EurekaHealthIndicator;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.context.Lifecycle;
-import org.springframework.core.Ordered;
-import org.springframework.stereotype.Component;
-import org.springframework.util.Assert;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * This class is a replacement for EurekaHealthCheckHandler in spring-cloud-netflix-eureka-client:2.2.10.RELEASE, which is incompatible with Spring Boot 2.5.
- * EurekaHealthCheckHandler in 2.2.10.RELEASE relies on a few classes that are removed in Spring Boot 2.5.
- *
- * This code is almost entirely copied from the 3.1.x version of spring-cloud-netflix-eureka-client.
- * https://github.com/spring-cloud/spring-cloud-netflix/blob/3.1.x/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthCheckHandler.java
- *
- * There are minor formatting changes (e.g. making a variable final), the only other change is using ApimlDiscoveryCompositeHealthContributor
- * to bridge the difference between spring-cloud-commons:2.2.9.RELEASE and spring-cloud-commons:3.1.x.
- *
- * NOTE: This should be removed when the APIML upgrades to Spring Cloud 3.x.
- */
-@Component
-public class ApimlHealthCheckHandler implements HealthCheckHandler, ApplicationContextAware, InitializingBean, Ordered, Lifecycle {
- private static final Map STATUS_MAPPING = new HashMap<>();
-
- static {
- STATUS_MAPPING.put(Status.UNKNOWN, InstanceInfo.InstanceStatus.UNKNOWN);
- STATUS_MAPPING.put(Status.OUT_OF_SERVICE, InstanceInfo.InstanceStatus.OUT_OF_SERVICE);
- STATUS_MAPPING.put(Status.DOWN, InstanceInfo.InstanceStatus.DOWN);
- STATUS_MAPPING.put(Status.UP, InstanceInfo.InstanceStatus.UP);
- }
-
- private final StatusAggregator statusAggregator;
- private final Map healthContributors = new HashMap<>();
- private final Map reactiveHealthContributors = new HashMap<>();
-
- /**
- * {@code true} until the context is stopped.
- */
- private boolean running = true;
- private ApplicationContext applicationContext;
-
- public ApimlHealthCheckHandler(StatusAggregator statusAggregator) {
- this.statusAggregator = statusAggregator;
- Assert.notNull(statusAggregator, "StatusAggregator must not be null");
-
- }
-
- @Override
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- this.applicationContext = applicationContext;
- }
-
- @Override
- public void afterPropertiesSet() {
- populateHealthContributors(applicationContext.getBeansOfType(HealthContributor.class));
- reactiveHealthContributors.putAll(applicationContext.getBeansOfType(ReactiveHealthContributor.class));
- }
-
- void populateHealthContributors(Map healthContributors) {
- for (Map.Entry entry : healthContributors.entrySet()) {
- // ignore EurekaHealthIndicator and flatten the rest of the composite
- // otherwise there is a never ending cycle of down. See gh-643
- if (entry.getValue() instanceof ApimlDiscoveryCompositeHealthContributor) {
- ApimlDiscoveryCompositeHealthContributor indicator = (ApimlDiscoveryCompositeHealthContributor) entry.getValue();
- indicator.getIndicators().forEach((name, discoveryHealthIndicator) -> {
- if (!(discoveryHealthIndicator instanceof EurekaHealthIndicator)) {
- this.healthContributors.put(name, (HealthIndicator) discoveryHealthIndicator::health);
- }
- });
- } else {
- this.healthContributors.put(entry.getKey(), entry.getValue());
- }
- }
- }
-
- @Override
- public InstanceInfo.InstanceStatus getStatus(InstanceInfo.InstanceStatus instanceStatus) {
- if (running) {
- return getHealthStatus();
- } else {
- // Return nothing if the context is not running, so the status held by the
- // InstanceInfo remains unchanged.
- // See gh-1571
- return null;
- }
- }
-
- protected InstanceInfo.InstanceStatus getHealthStatus() {
- Status status = getStatus(statusAggregator);
- return mapToInstanceStatus(status);
- }
-
- protected Status getStatus(StatusAggregator statusAggregator) {
- Set statusSet = new HashSet<>();
- for (HealthContributor contributor : healthContributors.values()) {
- processContributor(statusSet, contributor);
- }
- for (ReactiveHealthContributor contributor : reactiveHealthContributors.values()) {
- processContributor(statusSet, contributor);
- }
- return statusAggregator.getAggregateStatus(statusSet);
- }
-
- private void processContributor(Set statusSet, HealthContributor contributor) {
- if (contributor instanceof CompositeHealthContributor) {
- for (NamedContributor contrib : (CompositeHealthContributor) contributor) {
- processContributor(statusSet, contrib.getContributor());
- }
- } else if (contributor instanceof HealthIndicator) {
- statusSet.add(((HealthIndicator) contributor).health().getStatus());
- }
- }
-
- private void processContributor(Set statusSet, ReactiveHealthContributor contributor) {
- if (contributor instanceof CompositeReactiveHealthContributor) {
- for (NamedContributor contrib : (CompositeReactiveHealthContributor) contributor) {
- processContributor(statusSet, contrib.getContributor());
- }
- } else if (contributor instanceof ReactiveHealthIndicator) {
- Health health = ((ReactiveHealthIndicator) contributor).health().block();
- if (health != null) {
- statusSet.add(health.getStatus());
- }
- }
- }
-
- protected InstanceInfo.InstanceStatus mapToInstanceStatus(Status status) {
- if (!STATUS_MAPPING.containsKey(status)) {
- return InstanceInfo.InstanceStatus.UNKNOWN;
- }
- return STATUS_MAPPING.get(status);
- }
-
- @Override
- public int getOrder() {
- // registered with a high order priority so the close() method is invoked early
- // and *BEFORE* EurekaAutoServiceRegistration
- // (must be in effect when the registration is closed and the eureka replication
- // triggered -> health check handler is
- // consulted at that moment)
- return Ordered.HIGHEST_PRECEDENCE;
- }
-
- @Override
- public void start() {
- running = true;
- }
-
- @Override
- public void stop() {
- running = false;
- }
-
- @Override
- public boolean isRunning() {
- return true;
- }
-}
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicator.java b/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicator.java
index 1a1d5bd2b5..8892b83b43 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicator.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicator.java
@@ -10,8 +10,8 @@
package org.zowe.apiml.product.compatibility;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.system.DiskSpaceHealthIndicator;
+import org.springframework.boot.health.contributor.Health;
+import org.springframework.boot.health.application.DiskSpaceHealthIndicator;
import org.springframework.util.unit.DataSize;
import java.io.File;
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/DiskHealthConfiguration.java b/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/DiskHealthConfiguration.java
index dd13feb663..e4d176a5cb 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/DiskHealthConfiguration.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/compatibility/DiskHealthConfiguration.java
@@ -10,9 +10,9 @@
package org.zowe.apiml.product.compatibility;
-import org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthContributorAutoConfiguration;
-import org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthIndicatorProperties;
-import org.springframework.boot.actuate.system.DiskSpaceHealthIndicator;
+import org.springframework.boot.health.autoconfigure.application.DiskSpaceHealthContributorAutoConfiguration;
+import org.springframework.boot.health.autoconfigure.application.DiskSpaceHealthIndicatorProperties;
+import org.springframework.boot.health.application.DiskSpaceHealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/config/ServerAddressPropertiesUpdater.java b/apiml-common/src/main/java/org/zowe/apiml/product/config/ServerAddressPropertiesUpdater.java
index 9dcf7f0380..5edc0d11f3 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/config/ServerAddressPropertiesUpdater.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/config/ServerAddressPropertiesUpdater.java
@@ -19,9 +19,9 @@
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
-import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
-import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory;
-import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory;
+import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.AbstractConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
@@ -226,7 +226,7 @@ public AdditionalConnectorReactive(List connectorCust
@Override
protected void initFactory(TomcatReactiveWebServerFactory factory) {
- factory.addAdditionalTomcatConnectors(connector);
+ factory.addAdditionalConnectors(connector);
factory.addConnectorCustomizers(connectorCustomizers.toArray(new TomcatConnectorCustomizer[0]));
}
@@ -243,7 +243,7 @@ public AdditionalConnectorServlet(List connectorCusto
@Override
protected void initFactory(TomcatServletWebServerFactory factory) {
- factory.addAdditionalTomcatConnectors(connector);
+ factory.addAdditionalConnectors(connector);
factory.addConnectorCustomizers(connectorCustomizers.toArray(new TomcatConnectorCustomizer[0]));
}
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlNonZosOpenTelemetryResourceProvider.java b/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlNonZosOpenTelemetryResourceProvider.java
index a67632d802..03b8c09697 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlNonZosOpenTelemetryResourceProvider.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlNonZosOpenTelemetryResourceProvider.java
@@ -15,7 +15,7 @@
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.stereotype.Component;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
@ConditionalOnMissingBean(ApimlZosOpenTelemetryResourceProvider.class)
@Component
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlOpenTelemetryResourceProvider.java b/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlOpenTelemetryResourceProvider.java
index f8d987e513..a659278f5e 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlOpenTelemetryResourceProvider.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlOpenTelemetryResourceProvider.java
@@ -18,7 +18,7 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
@Slf4j
public abstract class ApimlOpenTelemetryResourceProvider implements ResourceProvider {
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlZosOpenTelemetryResourceProvider.java b/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlZosOpenTelemetryResourceProvider.java
index 5fdc67ec07..1ebb591eec 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlZosOpenTelemetryResourceProvider.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/opentelemetry/ApimlZosOpenTelemetryResourceProvider.java
@@ -21,7 +21,7 @@
import org.springframework.stereotype.Component;
import org.zowe.apiml.product.zos.ZosSystemInformation;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.util.Optional;
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/security/WebServerSecurityConfig.java b/apiml-common/src/main/java/org/zowe/apiml/product/security/WebServerSecurityConfig.java
index a31a19a7f1..58ecc350aa 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/security/WebServerSecurityConfig.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/security/WebServerSecurityConfig.java
@@ -13,7 +13,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.tomcat.TomcatConnectorCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/apiml-common/src/main/java/org/zowe/apiml/product/web/HttpConfig.java b/apiml-common/src/main/java/org/zowe/apiml/product/web/HttpConfig.java
index 6de3507887..09daaea945 100644
--- a/apiml-common/src/main/java/org/zowe/apiml/product/web/HttpConfig.java
+++ b/apiml-common/src/main/java/org/zowe/apiml/product/web/HttpConfig.java
@@ -23,7 +23,7 @@
import org.apache.hc.core5.util.Timeout;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.web.server.autoconfigure.ServerProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -246,12 +246,16 @@ public HttpsFactory httpsFactory() {
*
* @return RestTemplate, which uses certificate from keystore to authenticate
*/
+ /**
+ * Note: Connection timeouts are configured at the HttpClient/ConnectionManager level
+ * (see HttpsFactory.buildHttpClient() for RequestConfig.setConnectionRequestTimeout and
+ * getConnectionManager() for ConnectionConfig.setConnectTimeout/setSocketTimeout),
+ * not on HttpComponentsClientHttpRequestFactory. This is the correct HC5 approach.
+ */
@Bean
@Primary
RestTemplate restTemplateWithKeystore() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(secureHttpClient);
- factory.setConnectionRequestTimeout(requestConnectionTimeout);
- factory.setConnectTimeout(requestConnectionTimeout);
return new RestTemplate(factory);
}
@@ -265,8 +269,6 @@ RestTemplate restTemplateWithKeystore() {
@Bean
RestTemplate restTemplateWithoutKeystore() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(secureHttpClientWithoutKeystore);
- factory.setConnectionRequestTimeout(requestConnectionTimeout);
- factory.setConnectTimeout(requestConnectionTimeout);
return new RestTemplate(factory);
}
diff --git a/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicatorTest.java b/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicatorTest.java
index 9574d7ab57..e386e8a9a3 100644
--- a/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicatorTest.java
+++ b/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/CustomDiskSpaceHealthIndicatorTest.java
@@ -13,8 +13,8 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.Status;
+import org.springframework.boot.health.contributor.Health;
+import org.springframework.boot.health.contributor.Status;
import org.springframework.util.unit.DataSize;
import java.io.File;
diff --git a/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/DiskHealthConfigurationTest.java b/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/DiskHealthConfigurationTest.java
index 02ffc3aa35..6a5cbc1fff 100644
--- a/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/DiskHealthConfigurationTest.java
+++ b/apiml-common/src/test/java/org/zowe/apiml/product/compatibility/DiskHealthConfigurationTest.java
@@ -12,8 +12,8 @@
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthIndicatorProperties;
-import org.springframework.boot.actuate.system.DiskSpaceHealthIndicator;
+import org.springframework.boot.health.autoconfigure.application.DiskSpaceHealthIndicatorProperties;
+import org.springframework.boot.health.application.DiskSpaceHealthIndicator;
import org.springframework.util.unit.DataSize;
import java.io.File;
diff --git a/apiml-common/src/test/java/org/zowe/apiml/product/web/HttpConfigTest.java b/apiml-common/src/test/java/org/zowe/apiml/product/web/HttpConfigTest.java
index b413e6412b..b353086289 100644
--- a/apiml-common/src/test/java/org/zowe/apiml/product/web/HttpConfigTest.java
+++ b/apiml-common/src/test/java/org/zowe/apiml/product/web/HttpConfigTest.java
@@ -17,7 +17,7 @@
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.web.server.autoconfigure.ServerProperties;
import org.springframework.boot.web.server.Ssl;
import org.springframework.context.ApplicationContext;
import org.springframework.test.util.ReflectionTestUtils;
diff --git a/apiml-security-common/build.gradle b/apiml-security-common/build.gradle
index 882fb7b61d..d1717a9dc2 100644
--- a/apiml-security-common/build.gradle
+++ b/apiml-security-common/build.gradle
@@ -15,6 +15,7 @@ dependencies {
implementation libs.apache.commons.lang3
implementation libs.http.client5
+ implementation libs.jackson.databind
implementation libs.nimbus.jose.jwt // Parsing
@@ -27,7 +28,6 @@ dependencies {
testCompileOnly libs.lombok
testImplementation libs.netty.reactor.http
- testImplementation libs.reactor.test
testAnnotationProcessor libs.lombok
testFixturesImplementation libs.nimbus.jose.jwt
diff --git a/apiml-security-common/src/main/java/org/zowe/apiml/security/common/config/WebClientConfig.java b/apiml-security-common/src/main/java/org/zowe/apiml/security/common/config/WebClientConfig.java
index cf818e8280..384116adb1 100644
--- a/apiml-security-common/src/main/java/org/zowe/apiml/security/common/config/WebClientConfig.java
+++ b/apiml-security-common/src/main/java/org/zowe/apiml/security/common/config/WebClientConfig.java
@@ -15,7 +15,7 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.web.server.autoconfigure.ServerProperties;
import org.springframework.cloud.gateway.config.HttpClientCustomizer;
import org.springframework.cloud.gateway.config.HttpClientFactory;
import org.springframework.cloud.gateway.config.HttpClientProperties;
diff --git a/apiml-tomcat-common/build.gradle b/apiml-tomcat-common/build.gradle
index 644865b562..60de3b0e03 100644
--- a/apiml-tomcat-common/build.gradle
+++ b/apiml-tomcat-common/build.gradle
@@ -5,6 +5,9 @@ dependencies {
api libs.zowe.zos.utils
implementation libs.netty.reactor.http
implementation libs.apache.commons.lang3
+ implementation libs.jackson.annotations
+ implementation libs.jackson.core
+ implementation libs.jackson.databind
testImplementation libs.spring.boot.starter.test
diff --git a/apiml-tomcat-common/src/main/java/org/zowe/apiml/gzip/GZipResponseUtils.java b/apiml-tomcat-common/src/main/java/org/zowe/apiml/gzip/GZipResponseUtils.java
index 8645784cb9..2251aee0c1 100644
--- a/apiml-tomcat-common/src/main/java/org/zowe/apiml/gzip/GZipResponseUtils.java
+++ b/apiml-tomcat-common/src/main/java/org/zowe/apiml/gzip/GZipResponseUtils.java
@@ -46,9 +46,9 @@ public static boolean shouldGzippedBodyBeZero(byte[] compressedBytes) {
/**
* Performs a number of checks to ensure response saneness according to the rules of RFC2616:
*
- *
If the response code is {@link javax.servlet.http.HttpServletResponse#SC_NO_CONTENT} then it is forbidden for the body
+ *
If the response code is {@link jakarta.servlet.http.HttpServletResponse#SC_NO_CONTENT} then it is forbidden for the body
* to contain anything. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.5
- *
If the response code is {@link javax.servlet.http.HttpServletResponse#SC_NOT_MODIFIED} then it is forbidden for the body
+ *
If the response code is {@link jakarta.servlet.http.HttpServletResponse#SC_NOT_MODIFIED} then it is forbidden for the body
* to contain anything. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
*
*
@@ -68,7 +68,7 @@ public static boolean shouldBodyBeZero(int responseStatus) {
*
* @param response the response which will have a header added to it. I.e this method changes its parameter
* @throws RuntimeException Either the response is committed or we were called using the include method
- * from a {@link javax.servlet.RequestDispatcher#include(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}
+ * from a {@link jakarta.servlet.RequestDispatcher#include(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)}
* method and the set header is ignored.
*/
public static void addGzipHeader(final HttpServletResponse response) throws GZipResponseException {
diff --git a/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/ApimlTomcatCustomizer.java b/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/ApimlTomcatCustomizer.java
index 13f32517ae..6cb67f16f2 100644
--- a/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/ApimlTomcatCustomizer.java
+++ b/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/ApimlTomcatCustomizer.java
@@ -18,7 +18,7 @@
import org.apache.tomcat.util.net.*;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.tomcat.TomcatConnectorCustomizer;
import org.springframework.stereotype.Component;
import org.zowe.apiml.exception.AttlsHandlerException;
import org.zowe.commons.attls.ContextIsNotInitializedException;
diff --git a/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatAcceptFixConfig.java b/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatAcceptFixConfig.java
index 3bd7a1c8c8..ee1df1f156 100644
--- a/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatAcceptFixConfig.java
+++ b/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatAcceptFixConfig.java
@@ -19,7 +19,7 @@
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.NioEndpoint;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.tomcat.TomcatConnectorCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatDefaultCertificate.java b/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatDefaultCertificate.java
index aa0798583b..225031f28d 100644
--- a/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatDefaultCertificate.java
+++ b/apiml-tomcat-common/src/main/java/org/zowe/apiml/product/web/TomcatDefaultCertificate.java
@@ -13,7 +13,7 @@
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.net.SSLHostConfig;
import org.apache.tomcat.util.net.SSLHostConfigCertificate;
-import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.tomcat.TomcatConnectorCustomizer;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
diff --git a/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatAcceptFixConfigTest.java b/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatAcceptFixConfigTest.java
index ab44dbad99..88dacdfb38 100644
--- a/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatAcceptFixConfigTest.java
+++ b/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatAcceptFixConfigTest.java
@@ -23,7 +23,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
+import org.springframework.boot.tomcat.TomcatConnectorCustomizer;
import java.io.IOException;
import java.lang.reflect.Field;
diff --git a/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatKeyringFixTest.java b/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatKeyringFixTest.java
index c799f5ca9f..79bb4ed4a3 100644
--- a/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatKeyringFixTest.java
+++ b/apiml-tomcat-common/src/test/java/org/zowe/apiml/product/web/TomcatKeyringFixTest.java
@@ -13,7 +13,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.Ssl;
import org.springframework.test.util.ReflectionTestUtils;
diff --git a/apiml/build.gradle b/apiml/build.gradle
index 6982e5566e..59ac592c89 100644
--- a/apiml/build.gradle
+++ b/apiml/build.gradle
@@ -61,6 +61,23 @@ dependencies {
api project(":caching-service")
api project(":api-catalog-services")
+ // Force Jersey/HK2 versions compatible with Java 17
+ configurations.all {
+ resolutionStrategy {
+ force 'org.glassfish.jersey.core:jersey-common:3.1.9'
+ force 'org.glassfish.jersey.core:jersey-client:3.1.9'
+ force 'org.glassfish.jersey.core:jersey-server:3.1.9'
+ force 'org.glassfish.jersey.inject:jersey-hk2:3.1.9'
+ force 'org.glassfish.jersey.media:jersey-media-jaxb:3.1.9'
+ force 'org.glassfish.jersey.containers:jersey-container-servlet:3.1.9'
+ force 'org.glassfish.hk2:hk2-locator:3.1.1'
+ force 'org.glassfish.hk2:hk2-api:3.1.1'
+ force 'org.glassfish.hk2:hk2-utils:3.1.1'
+ force 'org.glassfish.hk2:spring-bridge:3.1.1'
+ force 'org.glassfish.hk2.external:aopalliance-repackaged:3.1.1'
+ }
+ }
+
implementation libs.bundles.modulith
implementation libs.spring.boot.starter.web
implementation libs.swagger2.parser
diff --git a/apiml/src/main/java/org/zowe/apiml/ApimlApplication.java b/apiml/src/main/java/org/zowe/apiml/ApimlApplication.java
index 095f4b2b3d..87c4f7ab8d 100644
--- a/apiml/src/main/java/org/zowe/apiml/ApimlApplication.java
+++ b/apiml/src/main/java/org/zowe/apiml/ApimlApplication.java
@@ -11,11 +11,7 @@
package org.zowe.apiml;
import org.springframework.boot.SpringApplication;
-import org.springframework.boot.actuate.autoconfigure.logging.OpenTelemetryLoggingAutoConfiguration;
-import org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsAutoConfiguration;
-import org.springframework.boot.actuate.autoconfigure.opentelemetry.OpenTelemetryAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration;
import org.springframework.cloud.netflix.eureka.server.EurekaController;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@@ -24,13 +20,7 @@
import org.zowe.apiml.enable.register.RegisterToApiLayer;
import org.zowe.apiml.gateway.config.GatewayHealthIndicator;
-@SpringBootApplication(exclude = {
- ReactiveOAuth2ClientAutoConfiguration.class,
- OpenTelemetryAutoConfiguration.class,
- OpenTelemetryLoggingAutoConfiguration.class,
- io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration.class,
- CacheMetricsAutoConfiguration.class
-})
+@SpringBootApplication
@ComponentScan(
excludeFilters = {
@ComponentScan.Filter(
diff --git a/apiml/src/main/java/org/zowe/apiml/EurekaConfiguration.java b/apiml/src/main/java/org/zowe/apiml/EurekaConfiguration.java
index 1b0b65bf43..8a97fed58e 100644
--- a/apiml/src/main/java/org/zowe/apiml/EurekaConfiguration.java
+++ b/apiml/src/main/java/org/zowe/apiml/EurekaConfiguration.java
@@ -51,8 +51,8 @@
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Application;
import jakarta.ws.rs.ext.Provider;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spi.Container;
@@ -67,7 +67,7 @@
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.web.server.autoconfigure.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.cloud.client.actuator.HasFeatures;
@@ -104,7 +104,7 @@
@PropertySource("classpath:/eureka/server.properties")
public class EurekaConfiguration implements WebMvcConfigurer {
- private static final Log log = LogFactory.getLog(EurekaConfiguration.class);
+ private static final Logger log = LoggerFactory.getLogger(EurekaConfiguration.class);
/**
* List of packages containing Jersey resources required by the Eureka server.
diff --git a/apiml/src/main/java/org/zowe/apiml/EurekaHealthIndicatorApiml.java b/apiml/src/main/java/org/zowe/apiml/EurekaHealthIndicatorApiml.java
index bfa806dbf8..2e83f6e0f3 100644
--- a/apiml/src/main/java/org/zowe/apiml/EurekaHealthIndicatorApiml.java
+++ b/apiml/src/main/java/org/zowe/apiml/EurekaHealthIndicatorApiml.java
@@ -10,8 +10,8 @@
package org.zowe.apiml;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.Status;
+import org.springframework.boot.health.contributor.Health;
+import org.springframework.boot.health.contributor.Status;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.eureka.EurekaHealthIndicator;
import org.springframework.context.annotation.Primary;
diff --git a/apiml/src/main/java/org/zowe/apiml/EurekaRestController.java b/apiml/src/main/java/org/zowe/apiml/EurekaRestController.java
index dc8ffd2e5c..65b3ab4b0e 100644
--- a/apiml/src/main/java/org/zowe/apiml/EurekaRestController.java
+++ b/apiml/src/main/java/org/zowe/apiml/EurekaRestController.java
@@ -391,6 +391,11 @@ public List