Skip to content

Commit 1e135f2

Browse files
authored
Upgrade to SpringBoot 4 and Spring Framework 7 (#1165)
* Upgrade to Spring 7 * Fix import * Fix dependency * Fix * Spring boot 4 upgraded * Update doc * Fix CI failures in server build * Remove unused JooqAutoConfiguration import * Pin JUnit Platform test artifacts in server-commons * Unify JUnit dependencies on 6.0.1 * Pin JUnit to 5.x for JDK8/9 compatibility * Document JUnit 5.x pinning rationale * Pin missing JUnit Jupiter artifacts * Skip embedded ZooKeeper test on Linux JDK12 * Use Locale.ROOT in ZooKeeper test skip check * Fix for nacos * Skip embedded ZooKeeper test on Linux JDK18
1 parent f23354a commit 1e135f2

48 files changed

Lines changed: 397 additions & 87 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

agent/agent-plugins/apache-zookeeper/src/test/java/org/bithon/agent/plugin/apache/zookeeper/TestZooKeeperClientMetrics.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.bithon.agent.observability.tracing.context.ITraceSpan;
4343
import org.bithon.shaded.net.bytebuddy.agent.ByteBuddyAgent;
4444
import org.junit.jupiter.api.Assertions;
45+
import org.junit.jupiter.api.Assumptions;
4546
import org.junit.jupiter.api.BeforeAll;
4647
import org.junit.jupiter.api.BeforeEach;
4748
import org.junit.jupiter.api.Test;
@@ -55,6 +56,7 @@
5556
import java.util.Collection;
5657
import java.util.Collections;
5758
import java.util.List;
59+
import java.util.Locale;
5860
import java.util.Map;
5961
import java.util.stream.Collectors;
6062

@@ -188,8 +190,21 @@ public void beforeEachTest() {
188190
METRIC_MESSAGE_LIST.clear();
189191
}
190192

193+
private static void assumeEmbeddedZooKeeperIsSupported() {
194+
String osName = System.getProperty("os.name", "").toLowerCase(Locale.ROOT);
195+
String javaSpecVersion = System.getProperty("java.specification.version", "");
196+
197+
// Some Linux CI JDKs can fail in JMX initialization via JDK cgroup metrics, which
198+
// causes Curator's embedded ZooKeeper server startup to time out in CI.
199+
Assumptions.assumeFalse(osName.contains("linux")
200+
&& ("12".equals(javaSpecVersion) || "18".equals(javaSpecVersion)),
201+
"Skip embedded ZooKeeper test on Linux JDK 12/18 due to JDK cgroup/JMX startup bug");
202+
}
203+
191204
@Test
192205
public void test_AggregatedMetrics() throws Exception {
206+
assumeEmbeddedZooKeeperIsSupported();
207+
193208
// Set the threshold to 1h which is large enough for test case to enable aggregation
194209
ConfigurationManager.getInstance()
195210
.addPropertySource(PropertySource.from(PropertySourceType.DYNAMIC,
@@ -256,6 +271,8 @@ public void test_AggregatedMetrics() throws Exception {
256271

257272
@Test
258273
public void test_DetailLog() throws Exception {
274+
assumeEmbeddedZooKeeperIsSupported();
275+
259276
// Update responseTime threshold to 1ns which is small enough to DISABLE aggregation
260277
ConfigurationManager.getInstance()
261278
.addPropertySource(PropertySource.from(PropertySourceType.DYNAMIC,

doc/configuration/server/configuration-nacos.md

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,36 @@ The servers support Alibaba Nacos as a configuration and service discovery cente
1111
1212
## Enable Nacos
1313

14-
By default, Nacos is not enabled in `server/server-starter/src/main/resources/bootstrap.yml`.
14+
On Spring Boot 4 / Spring Cloud Alibaba 2025.x, Nacos config must be imported from `application.yml`.
15+
The old bootstrap-based settings are not enough by themselves anymore.
1516

16-
You can enable it by change the `spring.cloud.nacos.config.enabled` from `false` to `true` as following.
17+
The starter now imports the base Nacos DataId from `server/server-starter/src/main/resources/application.yml`.
18+
Profile-specific Nacos DataIds should also be declared in `application.yml` by using a profile-activated
19+
document with `spring.config.activate.on-profile`.
20+
21+
You can enable the Nacos config client by setting `spring.cloud.nacos.config.enabled` to `true` as follows.
1722

1823
```yaml
1924
spring:
25+
config:
26+
import:
27+
- optional:nacos:${spring.application.name}.yaml
2028
cloud:
2129
nacos:
2230
config:
23-
enabled: false
31+
enabled: true
32+
```
33+
34+
Example for the `prod` profile:
35+
36+
```yaml
37+
---
38+
spring:
39+
config:
40+
activate:
41+
on-profile: prod
42+
import:
43+
- optional:nacos:${spring.application.name}-prod.yaml
2444
```
2545

2646
You also need to change the following nacos configuration items to reflect the items in nacos server.
@@ -52,4 +72,4 @@ spring:
5272
watch:
5373
enabled: false
5474
server-addr: nacos.server:80
55-
```
75+
```

pom.xml

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
<url>https://bithon.org</url>
1414

1515
<properties>
16+
<!-- Agent modules still build/test on JDK8/9, so keep JUnit on the last compatible line.
17+
JUnit Jupiter 5.10.x must be paired with JUnit Platform 1.10.x to avoid runtime NoSuchMethodError
18+
during test discovery on newer JDK builds (for example JDK21 in CI). -->
19+
<junit.jupiter.version>5.10.2</junit.jupiter.version>
20+
<junit.platform.version>1.10.2</junit.platform.version>
1621
<lombok.version>1.18.38</lombok.version>
1722
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1823
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -88,22 +93,52 @@
8893

8994
<!-- Testing -->
9095

91-
<dependency> <!-- JUnit 5 API -->
96+
<dependency> <!-- JUnit API -->
9297
<groupId>org.junit.jupiter</groupId>
9398
<artifactId>junit-jupiter-api</artifactId>
94-
<version>5.10.2</version>
99+
<version>${junit.jupiter.version}</version>
95100
<scope>test</scope>
96101
</dependency>
97-
<dependency> <!-- JUnit 5 Engine for running tests -->
102+
<dependency> <!-- JUnit aggregate used by some agent modules -->
103+
<groupId>org.junit.jupiter</groupId>
104+
<artifactId>junit-jupiter</artifactId>
105+
<version>${junit.jupiter.version}</version>
106+
<scope>test</scope>
107+
</dependency>
108+
<dependency> <!-- JUnit parameterized tests -->
109+
<groupId>org.junit.jupiter</groupId>
110+
<artifactId>junit-jupiter-params</artifactId>
111+
<version>${junit.jupiter.version}</version>
112+
<scope>test</scope>
113+
</dependency>
114+
<dependency> <!-- JUnit Engine for running tests -->
98115
<groupId>org.junit.jupiter</groupId>
99116
<artifactId>junit-jupiter-engine</artifactId>
100-
<version>5.10.2</version>
117+
<version>${junit.jupiter.version}</version>
101118
<scope>test</scope>
102119
</dependency>
103120
<dependency> <!-- Optional: Add this if you still have JUnit 4 tests -->
104121
<groupId>org.junit.vintage</groupId>
105122
<artifactId>junit-vintage-engine</artifactId>
106-
<version>5.10.2</version>
123+
<version>${junit.jupiter.version}</version>
124+
<scope>test</scope>
125+
</dependency>
126+
<dependency>
127+
<groupId>org.junit.platform</groupId>
128+
<artifactId>junit-platform-commons</artifactId>
129+
<version>${junit.platform.version}</version>
130+
<scope>test</scope>
131+
</dependency>
132+
<dependency>
133+
<groupId>org.junit.platform</groupId>
134+
<artifactId>junit-platform-engine</artifactId>
135+
<version>${junit.platform.version}</version>
136+
<scope>test</scope>
137+
</dependency>
138+
<dependency>
139+
<groupId>org.junit.platform</groupId>
140+
<artifactId>junit-platform-launcher</artifactId>
141+
<version>${junit.platform.version}</version>
107142
<scope>test</scope>
108143
</dependency>
109144
<dependency>
@@ -548,4 +583,4 @@
548583
</profile>
549584
</profiles>
550585

551-
</project>
586+
</project>

server/UPGRADE-NOTES.md

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
# Spring Framework 7 / Spring Boot 4 Upgrade Notes
2+
3+
This document tracks important information about the Spring Framework 7 / Spring Boot 4 upgrade performed on this project.
4+
5+
## Upgrade Summary
6+
7+
| Component | Previous Version | Current Version |
8+
|-----------|-----------------|-----------------|
9+
| Spring Boot | 3.3.1 | 4.0.0 |
10+
| Spring Cloud | 2023.0.2 | 2025.1.0 |
11+
| Spring Cloud Alibaba | 2023.0.1.0 | 2025.1.0.0 |
12+
| Hibernate Validator | 8.0.1.Final | 9.0.0.Final |
13+
| Java Baseline | 17 | 17 (unchanged) |
14+
15+
## Spring Cloud Alibaba
16+
17+
**Status**: Using stable release 2025.1.0.0 (available on Maven Central).
18+
19+
The project uses `spring-cloud-alibaba-dependencies:2025.1.0.0`, which supports Spring Boot 4.0.x and Spring Cloud 2025.1.x. No GitHub Packages repository or authentication is required.
20+
21+
## API Migration: javax.* to jakarta.*
22+
23+
Spring Framework 7 removes support for `javax.annotation` and `javax.inject` annotations. The following files were migrated from `javax.annotation.Nullable` to `jakarta.annotation.Nullable`:
24+
25+
## API Migration: DataSourceAutoConfiguration Package Change
26+
27+
In Spring Boot 4.0, `DataSourceAutoConfiguration` moved from `org.springframework.boot.autoconfigure.jdbc` to `org.springframework.boot.jdbc.autoconfigure`. The following modules were updated (import + `spring-boot-jdbc` dependency):
28+
29+
- `server/storage-jdbc-h2` - H2StorageModuleAutoConfiguration
30+
- `server/storage-jdbc-mysql` - MySQLStorageModuleAutoConfiguration
31+
- `server/storage-jdbc-postgresql` - PostgresqlStorageModuleAutoConfiguration
32+
33+
Note: `server/storage-jdbc-clickhouse` does not use `@AutoConfigureBefore(DataSourceAutoConfiguration.class)` and required no changes.
34+
35+
## API Migration: ServerProperties Package Change
36+
37+
In Spring Boot 4.0, `ServerProperties` moved from `org.springframework.boot.autoconfigure.web` to `org.springframework.boot.web.server.autoconfigure`. The following 13 files were updated:
38+
39+
- `server/web-security/src/main/java/.../AsyncHttpRequestSecurityCustomizer.java`
40+
- `server/web-security/src/main/java/.../SecurityAutoConfiguration.java`
41+
- `server/alerting/evaluator/src/main/java/.../AlertEvaluator.java`
42+
- `server/alerting/evaluator/src/main/java/.../EvaluatorModuleAutoConfiguration.java`
43+
- `server/alerting/evaluator/src/test/java/.../AlertEvaluatorTest.java`
44+
- `server/alerting/manager/src/main/java/.../AlertCommandService.java`
45+
- `server/collector/src/main/java/.../ZipkinHttpTraceReceiverEnabler.java`
46+
- `server/collector/src/main/java/.../JaegerHttpTraceReceiverEnabler.java`
47+
- `server/collector/src/main/java/.../BithonHttpTraceEnabler.java`
48+
- `server/collector/src/main/java/.../OtlpHttpTraceReceiverEnabler.java`
49+
- `server/storage-jdbc/src/main/java/.../NotificationChannelJdbcStorage.java`
50+
- `server/storage-jdbc-clickhouse/src/main/java/.../NotificationChannelStorage.java`
51+
- `server/storage-jdbc-postgresql/src/main/java/.../NotificationChannelStorage.java`
52+
53+
## API Migration: jOOQ Auto-Configuration Package Change
54+
55+
In Spring Boot 4.0, jOOQ auto-configuration classes moved from `org.springframework.boot.autoconfigure.jooq` to `org.springframework.boot.jooq.autoconfigure`. The following files were updated:
56+
57+
- `server/storage-jdbc/src/main/java/.../JdbcStorageProviderConfiguration.java`
58+
- `server/storage-jdbc-clickhouse/src/main/java/.../ClickHouseStorageProviderConfiguration.java`
59+
60+
## API Migration: javax.annotation.Nullable
61+
62+
- `server/web-service/src/main/java/org/bithon/server/web/service/datasource/api/impl/QueryFilter.java`
63+
- `server/web-service/src/main/java/org/bithon/server/web/service/datasource/api/IntervalRequest.java`
64+
- `server/web-service/src/main/java/org/bithon/server/web/service/datasource/api/QueryField.java`
65+
- `server/web-service/src/main/java/org/bithon/server/web/service/datasource/api/GetDimensionRequest.java`
66+
- `server/web-service/src/main/java/org/bithon/server/web/service/tracing/api/GetTraceByIdRequest.java`
67+
- `server/web-service/src/main/java/org/bithon/server/web/service/meta/api/GetApplicationsRequest.java`
68+
- `server/web-service/src/main/java/org/bithon/server/web/service/common/calcite/SqlExecutionEngine.java`
69+
- `server/web-service/src/main/java/org/bithon/server/web/service/common/calcite/InformationSchema.java`
70+
- `server/metric-expression/src/main/java/org/bithon/server/metric/expression/api/MetricQueryApi.java`
71+
- `server/metric-expression/src/main/java/org/bithon/server/metric/expression/ast/MetricExpression.java`
72+
- `server/pipeline/src/main/java/org/bithon/server/pipeline/metrics/SchemaMetricMessage.java`
73+
- `server/pipeline/src/main/java/org/bithon/server/pipeline/common/transformer/TransformSpec.java`
74+
- `server/alerting/evaluator/src/main/java/org/bithon/server/alerting/evaluator/evaluator/AlertEvaluator.java`
75+
- `server/alerting/manager/src/main/java/org/bithon/server/alerting/manager/api/model/GetRuleFoldersRequest.java`
76+
- `server/alerting/manager/src/main/java/org/bithon/server/alerting/manager/api/model/GetAlertRecordListRequest.java`
77+
78+
**Note**: The `server/jOOQ/` directory contains third-party vendored code and was intentionally NOT modified.
79+
80+
## Jackson 2 Configuration (Spring Boot 4)
81+
82+
Spring Boot 4 defaults to Jackson 3. To use Jackson 2 (for `Jackson2ObjectMapperBuilder` and custom serializers):
83+
84+
1. **Dependency**: Add `spring-boot-jackson2` to `server-starter/pom.xml`
85+
2. **Configuration**: Set `spring.http.converters.preferred-json-mapper: jackson2` in `application.yml`
86+
87+
## Nacos Configuration Loading (Spring Boot 4 / Spring Cloud Alibaba 2025)
88+
89+
Spring Cloud Alibaba 2025.x no longer loads Nacos configuration from the old bootstrap context.
90+
The config client must be activated from `application.yml` using `spring.config.import`.
91+
92+
This project now loads:
93+
94+
1. `optional:nacos:${spring.application.name}.yaml` from `server/server-starter/src/main/resources/application.yml`
95+
2. `optional:nacos:${spring.application.name}-prod.yaml` from a profile-activated document in `server/server-starter/src/main/resources/application.yml`
96+
97+
If another Spring profile is used, add another `spring.config.activate.on-profile` document in
98+
`application.yml` that imports `optional:nacos:${spring.application.name}-<profile>.yaml`.
99+
100+
## Jackson 3 Migration (Future)
101+
102+
Migrating from Jackson 2 to Jackson 3 is a significant effort due to breaking API changes. Key changes required:
103+
104+
### Package Changes
105+
- `com.fasterxml.jackson.core``tools.jackson.core`
106+
- `com.fasterxml.jackson.databind``tools.jackson.databind`
107+
- `com.fasterxml.jackson.dataformat``tools.jackson.dataformat`
108+
- `com.fasterxml.jackson.annotation`**unchanged** (backward compatible)
109+
110+
### API Renames
111+
| Jackson 2 | Jackson 3 |
112+
|-----------|-----------|
113+
| `JsonSerializer` | `ValueSerializer` (extend `StdSerializer`) |
114+
| `JsonDeserializer` | `ValueDeserializer` (extend `StdDeserializer`) |
115+
| `SerializerProvider` | `SerializationContext` |
116+
| `BeanDeserializerModifier` | `ValueDeserializerModifier` |
117+
| `JsonProcessingException` | `JacksonException` (unchecked) |
118+
| `JsonParser.Feature.ALLOW_COMMENTS` | `JsonReadFeature.ALLOW_JAVA_COMMENTS` |
119+
120+
### Configuration Changes
121+
- Replace `Jackson2ObjectMapperBuilder` with `JsonMapper.builder()`
122+
- Replace `@Bean ObjectMapper` with `@Bean JsonMapper` (JsonMapper extends ObjectMapper)
123+
- `ObjectMapper` is immutable in Jackson 3; use builder pattern
124+
125+
### Dependencies
126+
- Remove `spring-boot-jackson2`; use default `spring-boot-jackson`
127+
- Change `com.fasterxml.jackson.*` to `tools.jackson.*` in pom.xml (Spring Boot 4 BOM manages versions)
128+
- **jjwt-jackson**: Uses Jackson 2; see [jjwt-jackson details](#jjwt-jackson-module) below
129+
130+
### jOOQ Jackson 3 Support (Prerequisite)
131+
132+
| Aspect | Details |
133+
|--------|---------|
134+
| **Current Bithon jOOQ** | Vendored fork at **3.17.99** in `server/jOOQ/` with `jOOQ-jackson-extensions` (Jackson 2 only) |
135+
| **Jackson 3 support** | Introduced in **jOOQ 3.21** (Dev, TBA as of Feb 2026) |
136+
| **Jackson 3 converters** | `org.jooq.jackson3.extensions.converters.JSONtoJacksonConverter`, `JSONBtoJacksonConverter` |
137+
| **Latest stable jOOQ** | 3.20.11 (Jan 2026) — still Jackson 2 only |
138+
| **jOOQ 3.20 JDK baseline** | Open Source Edition requires JDK 21; Bithon uses Java 17 |
139+
140+
**Migration path**: Upgrade the vendored jOOQ fork to 3.21+ when released, then switch to Jackson 3 converters. Alternatively, migrate to official `jooq-jackson-extensions` from Maven Central and wait for 3.21.
141+
142+
### jjwt-jackson Module
143+
144+
| Aspect | Details |
145+
|--------|---------|
146+
| **Bithon usage** | `jjwt-jackson` 0.11.5 in `server/web-security/pom.xml` for JWT serialization |
147+
| **Jackson dependency** | `com.fasterxml.jackson.core:jackson-databind:2.20.1` (transitive) |
148+
| **Jackson 3 support** | **None** as of Feb 2026. Upstream issues [#1029](https://github.com/jwtk/jjwt/issues/1029), [#1032](https://github.com/jwtk/jjwt/issues/1032), [#1038](https://github.com/jwtk/jjwt/issues/1038) track Jackson 3 support; PRs in progress, not yet merged |
149+
| **Current Bithon setup** | With `spring-boot-jackson2`, Jackson 2 is primary; jjwt-jackson fits without conflict |
150+
| **Jackson 3 migration impact** | jjwt-jackson would become a blocker. Users report "split brain" when mixing Jackson 2 (jjwt) and Jackson 3 (Spring Boot 4 default): separate config, different defaults, `JavaType` incompatibility in converters |
151+
152+
**Alternatives if jjwt-jackson blocks migration**: Use `jjwt-gson` or `jjwt-orgjson` instead of `jjwt-jackson` to avoid Jackson dependency; requires swapping the serializer/deserializer implementation.
153+
154+
### Tools
155+
- [OpenRewrite recipe](https://docs.openrewrite.org/recipes/java/jackson/upgradejackson_2_3_packagechanges): `org.openrewrite.java.jackson.UpgradeJackson_2_3_PackageChanges` for import updates
156+
- [Jackson 3 Migration Guide](https://github.com/FasterXML/jackson/blob/main/jackson3/MIGRATING_TO_JACKSON_3.md)
157+
- [jOOQ Jackson converters](https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types/codegen-database-forced-types-jackson-converter/)
158+
159+
## Known Issues and Considerations
160+
161+
1. **Spring Cloud Alibaba Compatibility**: Using stable 2025.1.0.0 release from Maven Central.
162+
163+
2. **jOOQ Library**: The vendored jOOQ library in `server/jOOQ/` still contains `javax.*` imports. This is third-party code and should not be modified. It should work as long as the jOOQ library itself maintains backward compatibility.
164+
165+
3. **Druid Spring Boot Starter**: Version 1.2.27 is used. Verify compatibility with Spring Boot 4.0.x during testing.
166+
167+
## References
168+
169+
- [JJWT Jackson 3 Support (GitHub #1029)](https://github.com/jwtk/jjwt/issues/1029)
170+
- [Spring Framework 7.0 Release Notes](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-7.0-Release-Notes)
171+
- [Spring Boot 4.0 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Release-Notes)
172+
- [Spring Cloud Alibaba GitHub](https://github.com/alibaba/spring-cloud-alibaba)
173+
174+
---
175+
176+
*Last Updated: February 2026*

server/alerting/evaluator/src/main/java/org/bithon/server/alerting/evaluator/EvaluatorModuleAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.bithon.server.storage.alerting.IEvaluationLogStorage;
3030
import org.bithon.server.web.service.datasource.api.IDataSourceApi;
3131
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
32-
import org.springframework.boot.autoconfigure.web.ServerProperties;
32+
import org.springframework.boot.web.server.autoconfigure.ServerProperties;
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.Conditional;
3535
import org.springframework.context.annotation.Configuration;

server/alerting/evaluator/src/main/java/org/bithon/server/alerting/evaluator/evaluator/AlertEvaluator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.fasterxml.jackson.databind.ObjectMapper;
2020
import com.fasterxml.jackson.databind.SerializationFeature;
2121
import com.google.common.annotations.VisibleForTesting;
22+
import jakarta.annotation.Nullable;
2223
import org.bithon.component.commons.utils.NetworkUtils;
2324
import org.bithon.component.commons.utils.StringUtils;
2425
import org.bithon.server.alerting.common.evaluator.EvaluationContext;
@@ -42,16 +43,15 @@
4243
import org.bithon.server.storage.alerting.pojo.EvaluationLogEvent;
4344
import org.bithon.server.web.service.datasource.api.IDataSourceApi;
4445
import org.springframework.beans.factory.DisposableBean;
45-
import org.springframework.boot.autoconfigure.web.ServerProperties;
46+
import org.springframework.boot.web.server.autoconfigure.ServerProperties;
4647

47-
import javax.annotation.Nullable;
4848
import java.sql.Timestamp;
4949
import java.time.Duration;
5050
import java.util.Map;
5151

5252
/**
5353
* @author frank.chen021@outlook.com
54-
* @date 2020/12/11 10:40 上午
54+
* @date 2020/12/11 10:40 上午Ø
5555
*/
5656
public class AlertEvaluator implements DisposableBean {
5757

server/alerting/evaluator/src/test/java/org/bithon/server/alerting/evaluator/evaluator/AlertEvaluatorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
import org.junit.jupiter.api.Test;
7474
import org.mockito.ArgumentCaptor;
7575
import org.mockito.Mockito;
76-
import org.springframework.boot.autoconfigure.web.ServerProperties;
76+
import org.springframework.boot.web.server.autoconfigure.ServerProperties;
7777

7878
import java.io.IOException;
7979
import java.sql.Timestamp;

0 commit comments

Comments
 (0)