Skip to content

Commit d8026bb

Browse files
authored
Merge pull request #289 from arey/feature/spring-boot-4
Migrate project from Spring Boot 3.5.7 to Spring Boot 4.0 #282
2 parents 5030c75 + a66fd63 commit d8026bb

21 files changed

+131
-171
lines changed

pom.xml

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@
55

66
<groupId>org.springframework.samples</groupId>
77
<artifactId>spring-petclinic-rest</artifactId>
8-
<version>3.4.3</version>
8+
<version>4.0.2</version>
99

1010
<description>REST version of the Spring Petclinic sample application</description>
1111
<url>https://spring-petclinic.github.io/</url>
1212

1313
<parent>
1414
<groupId>org.springframework.boot</groupId>
1515
<artifactId>spring-boot-starter-parent</artifactId>
16-
<version>3.5.7</version>
16+
<version>4.0.2</version>
1717
<relativePath/> <!-- lookup parent from Maven repository -->
1818
</parent>
1919

2020
<properties>
2121

2222
<!-- Third-party libraries -->
2323
<spring-data-jdbc.version>1.2.1.RELEASE</spring-data-jdbc.version>
24-
<springdoc-openapi-ui.version>2.8.13</springdoc-openapi-ui.version>
24+
<springdoc-openapi-ui.version>3.0.1</springdoc-openapi-ui.version>
2525
<jackson-databind-nullable.version>0.2.8</jackson-databind-nullable.version>
2626
<mapstruct.version>1.6.3</mapstruct.version>
2727
<jaxb-api.version>2.3.1</jaxb-api.version>
@@ -59,7 +59,7 @@
5959
</dependency>
6060
<dependency>
6161
<groupId>org.springframework.boot</groupId>
62-
<artifactId>spring-boot-starter-aop</artifactId>
62+
<artifactId>spring-boot-starter-aspectj</artifactId>
6363
</dependency>
6464
<dependency>
6565
<groupId>org.springframework.boot</groupId>
@@ -75,7 +75,7 @@
7575
</dependency>
7676
<dependency>
7777
<groupId>org.springframework.boot</groupId>
78-
<artifactId>spring-boot-starter-web</artifactId>
78+
<artifactId>spring-boot-starter-webmvc</artifactId>
7979
</dependency>
8080
<dependency>
8181
<groupId>org.springframework.boot</groupId>
@@ -127,8 +127,8 @@
127127
<scope>test</scope>
128128
</dependency>
129129
<dependency>
130-
<groupId>org.springframework.security</groupId>
131-
<artifactId>spring-security-test</artifactId>
130+
<groupId>org.springframework.boot</groupId>
131+
<artifactId>spring-boot-starter-security-test</artifactId>
132132
<scope>test</scope>
133133
</dependency>
134134
<dependency>
@@ -139,11 +139,11 @@
139139

140140
<!-- JSON / XML / Serialization libs -->
141141
<dependency>
142-
<groupId>com.fasterxml.jackson.core</groupId>
142+
<groupId>tools.jackson.core</groupId>
143143
<artifactId>jackson-core</artifactId>
144144
</dependency>
145145
<dependency>
146-
<groupId>com.fasterxml.jackson.core</groupId>
146+
<groupId>tools.jackson.core</groupId>
147147
<artifactId>jackson-databind</artifactId>
148148
</dependency>
149149
<dependency>
@@ -161,10 +161,6 @@
161161
<artifactId>jackson-databind-nullable</artifactId>
162162
<version>${jackson-databind-nullable.version}</version>
163163
</dependency>
164-
<dependency>
165-
<groupId>com.fasterxml.jackson.datatype</groupId>
166-
<artifactId>jackson-datatype-jsr310</artifactId>
167-
</dependency>
168164
<dependency>
169165
<groupId>org.mapstruct</groupId>
170166
<artifactId>mapstruct</artifactId>
@@ -176,9 +172,8 @@
176172
<version>${mapstruct.version}</version>
177173
</dependency>
178174
<dependency>
179-
<groupId>javax.xml.bind</groupId>
180-
<artifactId>jaxb-api</artifactId>
181-
<version>${jaxb-api.version}</version>
175+
<groupId>jakarta.xml.bind</groupId>
176+
<artifactId>jakarta.xml.bind-api</artifactId>
182177
</dependency>
183178
</dependencies>
184179

@@ -366,18 +361,17 @@
366361
<apiPackage>org.springframework.samples.petclinic.rest.api</apiPackage>
367362
<generateModels>true</generateModels>
368363
<modelPackage>org.springframework.samples.petclinic.rest.dto</modelPackage>
369-
<!--
370-
<generateSupportingFiles>true</generateSupportingFiles>
371-
<supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate>
372-
-->
373364
<generateApis>true</generateApis>
365+
<importMappings>
366+
<importMapping>Nullable=org.jspecify.annotations.Nullable</importMapping>
367+
</importMappings>
374368
<configOptions>
375369
<!-- RestController implementation is provided by Petclinic developers -->
376370
<interfaceOnly>true</interfaceOnly>
377371
<!-- Activating Java 8 features -->
378372
<performBeanValidation>true</performBeanValidation>
379-
<dateLibrary>java8</dateLibrary>
380373
<useSpringBoot3>true</useSpringBoot3>
374+
<useJakartaEe>true</useJakartaEe>
381375
<openApiNullable>false</openApiNullable>
382376
<!-- override the default library to jersey2 -->
383377
<serializationLibrary>jackson</serializationLibrary>

src/main/java/org/springframework/samples/petclinic/model/Owner.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
package org.springframework.samples.petclinic.model;
1717

18-
import org.springframework.beans.support.MutableSortDefinition;
19-
import org.springframework.beans.support.PropertyComparator;
2018
import org.springframework.core.style.ToStringCreator;
2119

2220
import jakarta.persistence.*;
@@ -91,7 +89,7 @@ protected void setPetsInternal(Set<Pet> pets) {
9189

9290
public List<Pet> getPets() {
9391
List<Pet> sortedPets = new ArrayList<>(getPetsInternal());
94-
PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true));
92+
sortedPets.sort(Comparator.comparing(Pet::getName, String.CASE_INSENSITIVE_ORDER));
9593
return Collections.unmodifiableList(sortedPets);
9694
}
9795

src/main/java/org/springframework/samples/petclinic/model/Pet.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
*/
1616
package org.springframework.samples.petclinic.model;
1717

18-
import org.springframework.beans.support.MutableSortDefinition;
19-
import org.springframework.beans.support.PropertyComparator;
20-
2118
import jakarta.persistence.*;
2219
import java.time.LocalDate;
2320
import java.util.*;
@@ -85,7 +82,7 @@ protected void setVisitsInternal(Set<Visit> visits) {
8582

8683
public List<Visit> getVisits() {
8784
List<Visit> sortedVisits = new ArrayList<>(getVisitsInternal());
88-
PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false));
85+
sortedVisits.sort(Comparator.comparing(Visit::getDate).reversed());
8986
return Collections.unmodifiableList(sortedVisits);
9087
}
9188

src/main/java/org/springframework/samples/petclinic/model/Vet.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
package org.springframework.samples.petclinic.model;
1717

1818
import com.fasterxml.jackson.annotation.JsonIgnore;
19-
import org.springframework.beans.support.MutableSortDefinition;
20-
import org.springframework.beans.support.PropertyComparator;
2119

2220
import jakarta.persistence.*;
2321
import jakarta.xml.bind.annotation.XmlElement;
@@ -55,7 +53,7 @@ protected void setSpecialtiesInternal(Set<Specialty> specialties) {
5553
@XmlElement
5654
public List<Specialty> getSpecialties() {
5755
List<Specialty> sortedSpecs = new ArrayList<>(getSpecialtiesInternal());
58-
PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true));
56+
sortedSpecs.sort(Comparator.comparing(Specialty::getName, String.CASE_INSENSITIVE_ORDER));
5957
return Collections.unmodifiableList(sortedSpecs);
6058
}
6159

src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616
package org.springframework.samples.petclinic.repository.jdbc;
17-
17+
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
1818
import org.springframework.context.annotation.Profile;
1919
import org.springframework.dao.DataAccessException;
2020
import org.springframework.dao.EmptyResultDataAccessException;
@@ -50,6 +50,7 @@
5050
* @author Antoine Rey
5151
* @author Vitaliy Fedoriv
5252
*/
53+
@DependsOnDatabaseInitialization
5354
@Repository
5455
@Profile("jdbc")
5556
public class JdbcOwnerRepositoryImpl implements OwnerRepository {
@@ -171,23 +172,23 @@ public Collection<Owner> findAll() throws DataAccessException {
171172
@Override
172173
@Transactional
173174
public void delete(Owner owner) throws DataAccessException {
174-
Map<String, Object> owner_params = new HashMap<>();
175-
owner_params.put("id", owner.getId());
175+
Map<String, Object> ownerParams = new HashMap<>();
176+
ownerParams.put("id", owner.getId());
176177
List<Pet> pets = owner.getPets();
177178
// cascade delete pets
178179
for (Pet pet : pets){
179-
Map<String, Object> pet_params = new HashMap<>();
180-
pet_params.put("id", pet.getId());
180+
Map<String, Object> petParams = new HashMap<>();
181+
petParams.put("id", pet.getId());
181182
// cascade delete visits
182183
List<Visit> visits = pet.getVisits();
183184
for (Visit visit : visits){
184-
Map<String, Object> visit_params = new HashMap<>();
185-
visit_params.put("id", visit.getId());
186-
this.namedParameterJdbcTemplate.update("DELETE FROM visits WHERE id=:id", visit_params);
185+
Map<String, Object> visitParams = new HashMap<>();
186+
visitParams.put("id", visit.getId());
187+
this.namedParameterJdbcTemplate.update("DELETE FROM visits WHERE id=:id", visitParams);
187188
}
188-
this.namedParameterJdbcTemplate.update("DELETE FROM pets WHERE id=:id", pet_params);
189+
this.namedParameterJdbcTemplate.update("DELETE FROM pets WHERE id=:id", petParams);
189190
}
190-
this.namedParameterJdbcTemplate.update("DELETE FROM owners WHERE id=:id", owner_params);
191+
this.namedParameterJdbcTemplate.update("DELETE FROM owners WHERE id=:id", ownerParams);
191192
}
192193

193194

src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import javax.sql.DataSource;
2525

26+
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
2627
import org.springframework.context.annotation.Profile;
2728
import org.springframework.dao.DataAccessException;
2829
import org.springframework.dao.EmptyResultDataAccessException;
@@ -37,7 +38,6 @@
3738
import org.springframework.samples.petclinic.model.Visit;
3839
import org.springframework.samples.petclinic.repository.OwnerRepository;
3940
import org.springframework.samples.petclinic.repository.PetRepository;
40-
import org.springframework.samples.petclinic.repository.VisitRepository;
4141
import org.springframework.samples.petclinic.util.EntityUtils;
4242
import org.springframework.stereotype.Repository;
4343

@@ -50,6 +50,7 @@
5050
* @author Mark Fisher
5151
* @author Vitaliy Fedoriv
5252
*/
53+
@DependsOnDatabaseInitialization
5354
@Repository
5455
@Profile("jdbc")
5556
public class JdbcPetRepositoryImpl implements PetRepository {
@@ -60,20 +61,15 @@ public class JdbcPetRepositoryImpl implements PetRepository {
6061

6162
private OwnerRepository ownerRepository;
6263

63-
private VisitRepository visitRepository;
64-
65-
6664
public JdbcPetRepositoryImpl(DataSource dataSource,
67-
OwnerRepository ownerRepository,
68-
VisitRepository visitRepository) {
65+
OwnerRepository ownerRepository) {
6966
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
7067

7168
this.insertPet = new SimpleJdbcInsert(dataSource)
7269
.withTableName("pets")
7370
.usingGeneratedKeyColumns("id");
7471

7572
this.ownerRepository = ownerRepository;
76-
this.visitRepository = visitRepository;
7773
}
7874

7975
@Override
@@ -124,12 +120,12 @@ private MapSqlParameterSource createPetParameterSource(Pet pet) {
124120
.addValue("type_id", pet.getType().getId())
125121
.addValue("owner_id", pet.getOwner().getId());
126122
}
127-
123+
128124
@Override
129125
public Collection<Pet> findAll() throws DataAccessException {
130126
Map<String, Object> params = new HashMap<>();
131-
Collection<Pet> pets = new ArrayList<Pet>();
132-
Collection<JdbcPet> jdbcPets = new ArrayList<JdbcPet>();
127+
Collection<Pet> pets = new ArrayList<>();
128+
Collection<JdbcPet> jdbcPets;
133129
jdbcPets = this.namedParameterJdbcTemplate
134130
.query("SELECT pets.id as pets_id, name, birth_date, type_id, owner_id FROM pets",
135131
params,
@@ -152,16 +148,16 @@ public Collection<Pet> findAll() throws DataAccessException {
152148

153149
@Override
154150
public void delete(Pet pet) throws DataAccessException {
155-
Map<String, Object> pet_params = new HashMap<>();
156-
pet_params.put("id", pet.getId());
151+
Map<String, Object> petParams = new HashMap<>();
152+
petParams.put("id", pet.getId());
157153
List<Visit> visits = pet.getVisits();
158154
// cascade delete visits
159155
for (Visit visit : visits) {
160-
Map<String, Object> visit_params = new HashMap<>();
161-
visit_params.put("id", visit.getId());
162-
this.namedParameterJdbcTemplate.update("DELETE FROM visits WHERE id=:id", visit_params);
156+
Map<String, Object> visitParams = new HashMap<>();
157+
visitParams.put("id", visit.getId());
158+
this.namedParameterJdbcTemplate.update("DELETE FROM visits WHERE id=:id", visitParams);
163159
}
164-
this.namedParameterJdbcTemplate.update("DELETE FROM pets WHERE id=:id", pet_params);
160+
this.namedParameterJdbcTemplate.update("DELETE FROM pets WHERE id=:id", petParams);
165161
}
166162

167163
}

src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717
package org.springframework.samples.petclinic.repository.jdbc;
1818

19-
import java.util.ArrayList;
2019
import java.util.Collection;
2120
import java.util.HashMap;
2221
import java.util.List;
2322
import java.util.Map;
2423

2524
import javax.sql.DataSource;
2625

26+
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
2727
import org.springframework.context.annotation.Profile;
2828
import org.springframework.dao.DataAccessException;
2929
import org.springframework.dao.EmptyResultDataAccessException;
@@ -43,6 +43,7 @@
4343
*
4444
*/
4545

46+
@DependsOnDatabaseInitialization
4647
@Repository
4748
@Profile("jdbc")
4849
public class JdbcPetTypeRepositoryImpl implements PetTypeRepository {
@@ -113,31 +114,31 @@ public void save(PetType petType) throws DataAccessException {
113114

114115
@Override
115116
public void delete(PetType petType) throws DataAccessException {
116-
Map<String, Object> pettype_params = new HashMap<>();
117-
pettype_params.put("id", petType.getId());
118-
List<Pet> pets = new ArrayList<Pet>();
117+
Map<String, Object> pettypeParams = new HashMap<>();
118+
pettypeParams.put("id", petType.getId());
119+
List<Pet> pets;
119120
pets = this.namedParameterJdbcTemplate.
120121
query("SELECT pets.id, name, birth_date, type_id, owner_id FROM pets WHERE type_id=:id",
121-
pettype_params,
122+
pettypeParams,
122123
BeanPropertyRowMapper.newInstance(Pet.class));
123124
// cascade delete pets
124125
for (Pet pet : pets){
125-
Map<String, Object> pet_params = new HashMap<>();
126-
pet_params.put("id", pet.getId());
127-
List<Visit> visits = new ArrayList<Visit>();
126+
Map<String, Object> petParams = new HashMap<>();
127+
petParams.put("id", pet.getId());
128+
List<Visit> visits;
128129
visits = this.namedParameterJdbcTemplate.query(
129130
"SELECT id, pet_id, visit_date, description FROM visits WHERE pet_id = :id",
130-
pet_params,
131+
petParams,
131132
BeanPropertyRowMapper.newInstance(Visit.class));
132133
// cascade delete visits
133134
for (Visit visit : visits){
134-
Map<String, Object> visit_params = new HashMap<>();
135-
visit_params.put("id", visit.getId());
136-
this.namedParameterJdbcTemplate.update("DELETE FROM visits WHERE id=:id", visit_params);
135+
Map<String, Object> visitParams = new HashMap<>();
136+
visitParams.put("id", visit.getId());
137+
this.namedParameterJdbcTemplate.update("DELETE FROM visits WHERE id=:id", visitParams);
137138
}
138-
this.namedParameterJdbcTemplate.update("DELETE FROM pets WHERE id=:id", pet_params);
139+
this.namedParameterJdbcTemplate.update("DELETE FROM pets WHERE id=:id", petParams);
139140
}
140-
this.namedParameterJdbcTemplate.update("DELETE FROM types WHERE id=:id", pettype_params);
141+
this.namedParameterJdbcTemplate.update("DELETE FROM types WHERE id=:id", pettypeParams);
141142
}
142143

143144
}

src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import javax.sql.DataSource;
2222

23+
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
2324
import org.springframework.context.annotation.Profile;
2425
import org.springframework.dao.DataAccessException;
2526
import org.springframework.dao.EmptyResultDataAccessException;
@@ -37,6 +38,7 @@
3738
*
3839
*/
3940

41+
@DependsOnDatabaseInitialization
4042
@Repository
4143
@Profile("jdbc")
4244
public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository {

0 commit comments

Comments
 (0)