Skip to content

Commit 17cad88

Browse files
committed
Bump to Spring Cloud 2025.1.0 (aka Oakwood) and Spring Boot 4
1 parent e8827d8 commit 17cad88

File tree

28 files changed

+330
-311
lines changed

28 files changed

+330
-311
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ Spring Petclinic integrates a Chatbot that allows you to interact with the appli
113113
This `spring-petlinic-genai-service` microservice currently supports **OpenAI** (default) or **Azure's OpenAI** as the LLM provider.
114114
In order to start the microservice, perform the following steps:
115115

116-
1. Decide which provider you want to use. By default, the `spring-ai-openai-spring-boot-starter` dependency is enabled.
117-
You can change it to `spring-ai-azure-openai-spring-boot-starter`in the `pom.xml`.
116+
1. Decide which provider you want to use. By default, the `spring-ai-starter-model-openai` dependency is enabled.
117+
You can change it to `spring-ai-starter-model-azure-openai`in the `pom.xml`.
118118
2. Create an OpenAI API key or a Azure OpenAI resource in your Azure Portal.
119119
Refer to the [OpenAI's quickstart](https://platform.openai.com/docs/quickstart) or [Azure's documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/) for further information on how to obtain these.
120120
You only need to populate the provider you're using - either openai, or azure-openai.

pom.xml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
<parent>
77
<groupId>org.springframework.boot</groupId>
88
<artifactId>spring-boot-starter-parent</artifactId>
9-
<version>3.4.1</version>
9+
<version>4.0.1</version>
1010
</parent>
1111

1212
<groupId>org.springframework.samples</groupId>
1313
<artifactId>spring-petclinic-microservices</artifactId>
14-
<version>3.4.1</version>
14+
<version>4.0.1</version>
1515
<name>${project.artifactId}</name>
1616
<packaging>pom</packaging>
1717

@@ -29,9 +29,10 @@
2929
<properties>
3030
<java.version>17</java.version>
3131

32-
<spring-cloud.version>2024.0.0</spring-cloud.version>
32+
<spring-cloud.version>2025.1.0</spring-cloud.version>
3333
<chaos-monkey-spring-boot.version>3.1.0</chaos-monkey-spring-boot.version>
3434
<jolokia-core.version>1.7.1</jolokia-core.version>
35+
<datasource-micrometer.version>2.0.1</datasource-micrometer.version>
3536

3637
<docker.image.prefix>springcommunity</docker.image.prefix>
3738
<docker.image.exposed.port>9090</docker.image.exposed.port>
@@ -65,6 +66,11 @@
6566
<artifactId>jolokia-core</artifactId>
6667
<version>${jolokia-core.version}</version>
6768
</dependency>
69+
<dependency>
70+
<groupId>net.ttddyy.observation</groupId>
71+
<artifactId>datasource-micrometer-spring-boot</artifactId>
72+
<version>${datasource-micrometer.version}</version>
73+
</dependency>
6874
</dependencies>
6975
</dependencyManagement>
7076

spring-petclinic-admin-server/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<parent>
1313
<groupId>org.springframework.samples</groupId>
1414
<artifactId>spring-petclinic-microservices</artifactId>
15-
<version>3.4.1</version>
15+
<version>4.0.1</version>
1616
</parent>
1717

1818
<properties>

spring-petclinic-api-gateway/pom.xml

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<parent>
1212
<groupId>org.springframework.samples</groupId>
1313
<artifactId>spring-petclinic-microservices</artifactId>
14-
<version>3.4.1</version>
14+
<version>4.0.1</version>
1515
</parent>
1616

1717
<properties>
@@ -20,7 +20,7 @@
2020
<webjars-angular.version>1.8.3</webjars-angular.version>
2121
<webjars-angular-ui-router.version>1.0.30</webjars-angular-ui-router.version>
2222
<webjars-marked.version>14.1.2</webjars-marked.version>
23-
<squareup-okhttp3.version>4.12.0</squareup-okhttp3.version>
23+
<squareup-okhttp3.version>5.0.0-alpha.14</squareup-okhttp3.version>
2424

2525
<libsass-maven-plugin.version>0.2.29</libsass-maven-plugin.version>
2626
<docker.image.exposed.port>8081</docker.image.exposed.port>
@@ -52,6 +52,10 @@
5252
<artifactId>spring-boot-starter-test</artifactId>
5353
<scope>test</scope>
5454
</dependency>
55+
<dependency>
56+
<groupId>org.springframework.boot</groupId>
57+
<artifactId>spring-boot-starter-webflux-test</artifactId>
58+
</dependency>
5559

5660
<!-- Spring Cloud -->
5761
<dependency>
@@ -68,7 +72,7 @@
6872
</dependency>
6973
<dependency>
7074
<groupId>org.springframework.cloud</groupId>
71-
<artifactId>spring-cloud-starter-gateway</artifactId>
75+
<artifactId>spring-cloud-starter-gateway-server-webflux</artifactId>
7276
</dependency>
7377

7478
<!-- Third parties -->
@@ -128,7 +132,7 @@
128132
</dependency>
129133
<dependency>
130134
<groupId>org.webjars</groupId>
131-
<artifactId>webjars-locator-core</artifactId>
135+
<artifactId>webjars-locator-lite</artifactId>
132136
</dependency>
133137
<dependency>
134138
<groupId>org.webjars.npm</groupId>
@@ -149,7 +153,13 @@
149153
</dependency>
150154
<dependency>
151155
<groupId>com.squareup.okhttp3</groupId>
152-
<artifactId>mockwebserver</artifactId>
156+
<artifactId>okhttp</artifactId>
157+
<version>${squareup-okhttp3.version}</version>
158+
<scope>test</scope>
159+
</dependency>
160+
<dependency>
161+
<groupId>com.squareup.okhttp3</groupId>
162+
<artifactId>mockwebserver3-junit5</artifactId>
153163
<version>${squareup-okhttp3.version}</version>
154164
<scope>test</scope>
155165
</dependency>

spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/boundary/web/FallbackController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.springframework.samples.petclinic.api.boundary.web;
22

3-
import org.apache.http.HttpStatus;
3+
import org.apache.hc.core5.http.HttpStatus;
44
import org.springframework.http.ResponseEntity;
55
import org.springframework.web.bind.annotation.PostMapping;
66
import org.springframework.web.bind.annotation.RestController;

spring-petclinic-api-gateway/src/main/resources/application.yml

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,44 @@ spring:
55
import: optional:configserver:${CONFIG_SERVER_URL:http://localhost:8888/}
66
cloud:
77
gateway:
8-
default-filters:
9-
- name: CircuitBreaker
10-
args:
11-
name: defaultCircuitBreaker
12-
fallbackUri: forward:/fallback
13-
- name: Retry
14-
args:
15-
retries: 1
16-
statuses: SERVICE_UNAVAILABLE
17-
methods: POST
18-
routes:
19-
- id: vets-service
20-
uri: lb://vets-service
21-
predicates:
22-
- Path=/api/vet/**
23-
filters:
24-
- StripPrefix=2
25-
- id: visits-service
26-
uri: lb://visits-service
27-
predicates:
28-
- Path=/api/visit/**
29-
filters:
30-
- StripPrefix=2
31-
- id: customers-service
32-
uri: lb://customers-service
33-
predicates:
34-
- Path=/api/customer/**
35-
filters:
36-
- StripPrefix=2
37-
- id: genai-service
38-
uri: lb://genai-service
39-
predicates:
40-
- Path=/api/genai/**
41-
filters:
42-
- StripPrefix=2
43-
- CircuitBreaker=name=genaiCircuitBreaker,fallbackUri=/fallback
8+
server:
9+
webflux:
10+
default-filters:
11+
- name: CircuitBreaker
12+
args:
13+
name: defaultCircuitBreaker
14+
fallbackUri: forward:/fallback
15+
- name: Retry
16+
args:
17+
retries: 1
18+
statuses: SERVICE_UNAVAILABLE
19+
methods: POST
20+
routes:
21+
- id: vets-service
22+
uri: lb://vets-service
23+
predicates:
24+
- Path=/api/vet/**
25+
filters:
26+
- StripPrefix=2
27+
- id: visits-service
28+
uri: lb://visits-service
29+
predicates:
30+
- Path=/api/visit/**
31+
filters:
32+
- StripPrefix=2
33+
- id: customers-service
34+
uri: lb://customers-service
35+
predicates:
36+
- Path=/api/customer/**
37+
filters:
38+
- StripPrefix=2
39+
- id: genai-service
40+
uri: lb://genai-service
41+
predicates:
42+
- Path=/api/genai/**
43+
filters:
44+
- StripPrefix=2
45+
- CircuitBreaker=name=genaiCircuitBreaker,fallbackUri=/fallback
4446

4547
---
4648
spring:

spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/application/VisitsServiceClientIntegrationTest.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.springframework.samples.petclinic.api.application;
22

3-
import okhttp3.mockwebserver.MockResponse;
4-
import okhttp3.mockwebserver.MockWebServer;
3+
import mockwebserver3.MockResponse;
4+
import mockwebserver3.MockWebServer;
55
import org.junit.jupiter.api.AfterEach;
66
import org.junit.jupiter.api.BeforeEach;
77
import org.junit.jupiter.api.Test;
@@ -11,7 +11,6 @@
1111

1212
import java.io.IOException;
1313
import java.util.Collections;
14-
import java.util.function.Consumer;
1514

1615
import static org.junit.jupiter.api.Assertions.assertEquals;
1716
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -33,14 +32,12 @@ void setUp() {
3332

3433
@AfterEach
3534
void shutdown() throws IOException {
36-
this.server.shutdown();
35+
this.server.close();
3736
}
3837

3938
@Test
4039
void getVisitsForPets_withAvailableVisitsService() {
41-
prepareResponse(response -> response
42-
.setHeader("Content-Type", "application/json")
43-
.setBody("{\"items\":[{\"id\":5,\"date\":\"2018-11-15\",\"description\":\"test visit\",\"petId\":1}]}"));
40+
prepareResponse();
4441

4542
Mono<Visits> visits = visitsServiceClient.getVisitsForPets(Collections.singletonList(1));
4643

@@ -55,9 +52,11 @@ private void assertVisitDescriptionEquals(Visits visits, int petId, String descr
5552
assertEquals(description, visits.items().get(0).description());
5653
}
5754

58-
private void prepareResponse(Consumer<MockResponse> consumer) {
59-
MockResponse response = new MockResponse();
60-
consumer.accept(response);
55+
private void prepareResponse() {
56+
MockResponse response = new MockResponse.Builder()
57+
.addHeader("Content-Type", "application/json")
58+
.body("{\"items\":[{\"id\":5,\"date\":\"2018-11-15\",\"description\":\"test visit\",\"petId\":1}]}")
59+
.build();
6160
this.server.enqueue(response);
6261
}
6362

spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package org.springframework.samples.petclinic.api.boundary.web;
22

33
import org.junit.jupiter.api.Test;
4-
import org.junit.jupiter.api.extension.ExtendWith;
54
import org.mockito.Mockito;
65
import org.springframework.beans.factory.annotation.Autowired;
7-
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
8-
import org.springframework.boot.test.mock.mockito.MockBean;
6+
import org.springframework.boot.webflux.test.autoconfigure.WebFluxTest;
97
import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JAutoConfiguration;
108
import org.springframework.context.annotation.Import;
119
import org.springframework.samples.petclinic.api.application.CustomersServiceClient;
1210
import org.springframework.samples.petclinic.api.application.VisitsServiceClient;
13-
import org.springframework.samples.petclinic.api.dto.*;
14-
import org.springframework.test.context.junit.jupiter.SpringExtension;
11+
import org.springframework.samples.petclinic.api.dto.OwnerDetails;
12+
import org.springframework.samples.petclinic.api.dto.PetDetails;
13+
import org.springframework.samples.petclinic.api.dto.VisitDetails;
14+
import org.springframework.samples.petclinic.api.dto.Visits;
15+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
1516
import org.springframework.test.web.reactive.server.WebTestClient;
1617
import reactor.core.publisher.Mono;
1718

@@ -20,15 +21,14 @@
2021
import java.util.Collections;
2122
import java.util.List;
2223

23-
@ExtendWith(SpringExtension.class)
2424
@WebFluxTest(controllers = ApiGatewayController.class)
2525
@Import({ReactiveResilience4JAutoConfiguration.class, CircuitBreakerConfiguration.class})
2626
class ApiGatewayControllerTest {
2727

28-
@MockBean
28+
@MockitoBean
2929
private CustomersServiceClient customersServiceClient;
3030

31-
@MockBean
31+
@MockitoBean
3232
private VisitsServiceClient visitsServiceClient;
3333

3434
@Autowired

spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/CircuitBreakerConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.springframework.samples.petclinic.api.boundary.web;
22

3+
import io.github.resilience4j.bulkhead.BulkheadRegistry;
34
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
45
import io.github.resilience4j.timelimiter.TimeLimiterRegistry;
56
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigurationProperties;
@@ -20,6 +21,11 @@ public TimeLimiterRegistry timeLimiterRegistry() {
2021
return TimeLimiterRegistry.ofDefaults();
2122
}
2223

24+
@Bean
25+
public BulkheadRegistry bulkheadRegistry() {
26+
return BulkheadRegistry.ofDefaults();
27+
}
28+
2329
@Bean
2430
@Primary
2531
public Resilience4JConfigurationProperties resilience4JConfigurationProperties(){

spring-petclinic-config-server/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<parent>
1212
<groupId>org.springframework.samples</groupId>
1313
<artifactId>spring-petclinic-microservices</artifactId>
14-
<version>3.4.1</version>
14+
<version>4.0.1</version>
1515
</parent>
1616

1717
<properties>

0 commit comments

Comments
 (0)