From 37d53152a08a5de9d225c7f25f41b77c5d8b3cae Mon Sep 17 00:00:00 2001 From: Patrick Baumgartner Date: Sat, 22 Nov 2025 17:03:50 +0100 Subject: [PATCH] Upgrade to Spring Boot 4.0.0 Signed-off-by: Patrick Baumgartner --- README.md | 4 ++-- build.gradle | 9 ++++----- docker-compose.yml | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- k8s/db.yml | 2 +- mvnw | 2 +- pom.xml | 13 ++++++------- .../samples/petclinic/owner/OwnerRepository.java | 1 - .../samples/petclinic/MySqlIntegrationTests.java | 4 ++-- .../samples/petclinic/MysqlTestApplication.java | 6 +++--- .../petclinic/service/ClinicServiceTests.java | 2 +- .../system/CrashControllerIntegrationTests.java | 2 +- 12 files changed, 24 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 379bd42a6..e792c0dab 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,13 @@ A similar setup is provided for MySQL and PostgreSQL if a persistent database co You can start MySQL or PostgreSQL locally with whatever installer works for your OS or use docker: ```bash -docker run -e MYSQL_USER=petclinic -e MYSQL_PASSWORD=petclinic -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:9.2 +docker run -e MYSQL_USER=petclinic -e MYSQL_PASSWORD=petclinic -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:9.5 ``` or ```bash -docker run -e POSTGRES_USER=petclinic -e POSTGRES_PASSWORD=petclinic -e POSTGRES_DB=petclinic -p 5432:5432 postgres:18.0 +docker run -e POSTGRES_USER=petclinic -e POSTGRES_PASSWORD=petclinic -e POSTGRES_DB=petclinic -p 5432:5432 postgres:18.1 ``` Further documentation is provided for [MySQL](https://github.com/spring-projects/spring-petclinic/blob/main/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt) diff --git a/build.gradle b/build.gradle index 36463df6b..3c3634222 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,10 @@ plugins { id 'java' id 'checkstyle' - id 'org.springframework.boot' version '4.0.0-RC2' + id 'org.springframework.boot' version '4.0.0' id 'io.spring.dependency-management' version '1.1.7' id 'org.graalvm.buildtools.native' version '0.11.1' - id 'org.cyclonedx.bom' version '3.0.0' + id 'org.cyclonedx.bom' version '3.0.2' id 'io.spring.javaformat' version '0.0.47' id "io.spring.nohttp" version "0.0.11" id 'net.ltgt.errorprone' version '4.3.0' @@ -25,9 +25,9 @@ repositories { mavenCentral() } -ext.checkstyleVersion = "11.1.0" +ext.checkstyleVersion = "12.1.2" ext.springJavaformatCheckstyleVersion = "0.0.47" -ext.webjarsLocatorLiteVersion = "1.1.1" +ext.webjarsLocatorLiteVersion = "1.1.2" ext.webjarsFontawesomeVersion = "4.7.0" ext.webjarsBootstrapVersion = "5.3.8" ext.errorProneVersion = "2.42.0" @@ -78,7 +78,6 @@ checkstyleNohttp { } tasks.withType(JavaCompile).configureEach { - options.release = 17 options.errorprone { disableAllChecks = true } diff --git a/docker-compose.yml b/docker-compose.yml index 50c731a91..b2313a1e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: mysql: - image: mysql:9.2 + image: mysql:9.5 ports: - "3306:3306" environment: @@ -12,7 +12,7 @@ services: volumes: - "./conf.d:/etc/mysql/conf.d:ro" postgres: - image: postgres:18.0 + image: postgres:18.1 ports: - "5432:5432" environment: diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c2462..23449a2b5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/k8s/db.yml b/k8s/db.yml index c2c63037a..5c6e0f9e2 100644 --- a/k8s/db.yml +++ b/k8s/db.yml @@ -41,7 +41,7 @@ spec: app: demo-db spec: containers: - - image: postgres:18.0 + - image: postgres:18.1 name: postgresql env: - name: POSTGRES_USER diff --git a/mvnw b/mvnw index 885f47143..33c353fae 100755 --- a/mvnw +++ b/mvnw @@ -185,7 +185,7 @@ fi __MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' [ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v -# normalize https auth +# normalize http auth case "${MVNW_PASSWORD:+has-password}" in '') MVNW_USERNAME='' MVNW_PASSWORD='' ;; has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; diff --git a/pom.xml b/pom.xml index 7eddae997..9c852088f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 4.0.0-RC2 + 4.0.0 @@ -19,20 +19,19 @@ 25 - 17 UTF-8 UTF-8 - 2024-11-28T14:37:52Z + 2025-11-22T16:15:42Z - 1.1.1 + 1.1.2 5.3.8 4.7.0 - 11.1.0 + 12.1.2 2.42.0 - 0.8.13 + 0.8.14 0.3.4 1.0.0 3.6.0 @@ -290,10 +289,10 @@ default-compile - compile compile + compile -XDcompilePolicy=simple diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java index e0e9b2f0b..d2b3dde40 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java @@ -17,7 +17,6 @@ package org.springframework.samples.petclinic.owner; import java.util.Optional; -import jakarta.annotation.Nonnull; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/test/java/org/springframework/samples/petclinic/MySqlIntegrationTests.java b/src/test/java/org/springframework/samples/petclinic/MySqlIntegrationTests.java index 607593aad..0cacc580a 100644 --- a/src/test/java/org/springframework/samples/petclinic/MySqlIntegrationTests.java +++ b/src/test/java/org/springframework/samples/petclinic/MySqlIntegrationTests.java @@ -33,9 +33,9 @@ import org.springframework.samples.petclinic.vet.VetRepository; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.aot.DisabledInAotMode; import org.springframework.web.client.RestTemplate; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @@ -47,7 +47,7 @@ class MySqlIntegrationTests { @ServiceConnection @Container - static MySQLContainer container = new MySQLContainer<>(DockerImageName.parse("mysql:9.2")); + static MySQLContainer container = new MySQLContainer(DockerImageName.parse("mysql:9.5")); @LocalServerPort int port; diff --git a/src/test/java/org/springframework/samples/petclinic/MysqlTestApplication.java b/src/test/java/org/springframework/samples/petclinic/MysqlTestApplication.java index 2a4ea8e06..e18b6cbaf 100644 --- a/src/test/java/org/springframework/samples/petclinic/MysqlTestApplication.java +++ b/src/test/java/org/springframework/samples/petclinic/MysqlTestApplication.java @@ -21,7 +21,7 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnect import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; /** @@ -35,8 +35,8 @@ public class MysqlTestApplication { @ServiceConnection @Profile("mysql") @Bean - static MySQLContainer container() { - return new MySQLContainer<>(DockerImageName.parse("mysql:9.2")); + static MySQLContainer container() { + return new MySQLContainer(DockerImageName.parse("mysql:9.5")); } public static void main(String[] args) { diff --git a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceTests.java b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceTests.java index 5d1eabc2c..ddc5bab1e 100644 --- a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceTests.java +++ b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceTests.java @@ -31,9 +31,9 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.samples.petclinic.owner.Owner; import org.springframework.samples.petclinic.owner.OwnerRepository; -import org.springframework.samples.petclinic.owner.PetTypeRepository; import org.springframework.samples.petclinic.owner.Pet; import org.springframework.samples.petclinic.owner.PetType; +import org.springframework.samples.petclinic.owner.PetTypeRepository; import org.springframework.samples.petclinic.owner.Visit; import org.springframework.samples.petclinic.vet.Vet; import org.springframework.samples.petclinic.vet.VetRepository; diff --git a/src/test/java/org/springframework/samples/petclinic/system/CrashControllerIntegrationTests.java b/src/test/java/org/springframework/samples/petclinic/system/CrashControllerIntegrationTests.java index 1046fabe4..509585129 100644 --- a/src/test/java/org/springframework/samples/petclinic/system/CrashControllerIntegrationTests.java +++ b/src/test/java/org/springframework/samples/petclinic/system/CrashControllerIntegrationTests.java @@ -48,7 +48,7 @@ import org.springframework.http.ResponseEntity; */ // NOT Waiting https://github.com/spring-projects/spring-boot/issues/5574 @SpringBootTest(webEnvironment = RANDOM_PORT, - properties = { "server.error.include-message=ALWAYS", "management.endpoints.access.default=none" }) + properties = { "spring.web.error.include-message=ALWAYS", "management.endpoints.access.default=none" }) @AutoConfigureTestRestTemplate class CrashControllerIntegrationTests {