Skip to content

Commit 496aebc

Browse files
authored
Merge pull request #72 from couchbase-examples/fix/spring-boot-4-upgrade
Upgrade to Spring Boot 4.0.1 with springdoc-openapi 3.0.1
2 parents 8db5c05 + 26bda27 commit 496aebc

File tree

9 files changed

+29
-20
lines changed

9 files changed

+29
-20
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ DB_USERNAME=your-username
7979
DB_PASSWORD=your-password
8080
```
8181

82-
The `application.properties` file uses these environment variables with modern Spring Boot 3.5+ properties:
82+
The `application.properties` file uses these environment variables with modern Spring Boot 4.0+ properties:
8383

8484
```properties
8585
# Server configuration
8686
server.forward-headers-strategy=framework
8787

88-
# Modern Couchbase configuration (Spring Boot 3.5+)
88+
# Modern Couchbase configuration (Spring Boot 4.0+)
8989
spring.couchbase.connection-string=${DB_CONN_STR}
9090
spring.couchbase.username=${DB_USERNAME}
9191
spring.couchbase.password=${DB_PASSWORD}
@@ -178,7 +178,7 @@ public class CouchbaseConfiguration extends AbstractCouchbaseConfiguration {
178178

179179
> _from config/CouchbaseConfiguration.java_
180180
181-
This configuration uses modern Spring Boot 3.5+ properties and automatically loads environment variables from `.env` files for local development. The configuration assumes you have either a locally running Couchbase server or a Couchbase Capella cluster.
181+
This configuration uses modern Spring Boot 4.0+ properties and automatically loads environment variables from `.env` files for local development. The configuration assumes you have either a locally running Couchbase server or a Couchbase Capella cluster.
182182

183183
Applications deployed to production or staging environments should use less privileged credentials created using [Role-Based Access Control](https://docs.couchbase.com/go-sdk/current/concept-docs/rbac.html).
184184
Please refer to [Managing Connections using the Java SDK with Couchbase Server](https://docs.couchbase.com/java-sdk/current/howtos/managing-connections.html) for more information on Capella and local cluster connections.

build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugins {
2-
id 'org.springframework.boot' version '3.5.7'
2+
id 'org.springframework.boot' version '4.0.1'
33
id 'io.spring.dependency-management' version '1.1.7'
44
id 'java'
55
}
@@ -35,11 +35,13 @@ dependencies {
3535
testCompileOnly 'org.projectlombok:lombok:'
3636
testAnnotationProcessor 'org.projectlombok:lombok'
3737

38-
// swagger 3 springdoc openapi 2
39-
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.14'
38+
// swagger 3 springdoc openapi 3 for Spring Boot 4
39+
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.1'
4040

4141

4242
testImplementation 'org.springframework.boot:spring-boot-starter-test'
43+
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
44+
testImplementation 'org.springframework.boot:spring-boot-starter-restclient'
4345
}
4446

4547
tasks.named('test') {

src/main/java/org/couchbase/quickstart/springdata/Application.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.springframework.boot.CommandLineRunner;
88
import org.springframework.boot.SpringApplication;
99
import org.springframework.boot.autoconfigure.SpringBootApplication;
10-
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
1110
import org.springframework.context.annotation.Bean;
1211
import org.springframework.web.filter.ForwardedHeaderFilter;
1312

@@ -21,7 +20,7 @@
2120
**/
2221

2322
@Slf4j
24-
@SpringBootApplication(exclude = SecurityAutoConfiguration.class, proxyBeanMethods = false)
23+
@SpringBootApplication(proxyBeanMethods = false)
2524
@OpenAPIDefinition(info = @Info(title = TITLE, version = VERSION, description = DESCRIPTION))
2625
public class Application implements CommandLineRunner {
2726

src/main/java/org/couchbase/quickstart/springdata/models/RestResponsePage.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,17 @@
77

88
import com.fasterxml.jackson.annotation.JsonCreator;
99
import com.fasterxml.jackson.annotation.JsonProperty;
10-
import com.fasterxml.jackson.databind.JsonNode;
1110

1211
public class RestResponsePage<T> extends PageImpl<T> {
1312
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
1413
public RestResponsePage(@JsonProperty("content") List<T> content,
1514
@JsonProperty("number") int number,
1615
@JsonProperty("size") int size,
1716
@JsonProperty("totalElements") Long totalElements,
18-
@JsonProperty("pageable") JsonNode pageable,
17+
@JsonProperty("pageable") Object pageable,
1918
@JsonProperty("last") boolean last,
2019
@JsonProperty("totalPages") int totalPages,
21-
@JsonProperty("sort") JsonNode sort,
20+
@JsonProperty("sort") Object sort,
2221
@JsonProperty("first") boolean first,
2322
@JsonProperty("numberOfElements") int numberOfElements) {
2423

src/main/java/org/couchbase/quickstart/springdata/models/RestResponseSlice.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,23 @@
88
import com.fasterxml.jackson.annotation.JsonCreator;
99
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
1010
import com.fasterxml.jackson.annotation.JsonProperty;
11-
import com.fasterxml.jackson.databind.JsonNode;
1211

1312
@JsonIgnoreProperties(ignoreUnknown = true)
1413
public class RestResponseSlice<T> extends SliceImpl<T> {
1514
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
1615
public RestResponseSlice(@JsonProperty("content") List<T> content,
1716
@JsonProperty("number") int number,
1817
@JsonProperty("size") int size,
19-
@JsonProperty("pageable") JsonNode pageable,
18+
@JsonProperty("pageable") Object pageable,
2019
@JsonProperty("last") boolean last,
21-
@JsonProperty("sort") JsonNode sort,
20+
@JsonProperty("sort") Object sort,
2221
@JsonProperty("first") boolean first,
2322
@JsonProperty("numberOfElements") int numberOfElements,
24-
@JsonProperty("hasNext") boolean hasNext) {
23+
@JsonProperty("hasNext") Boolean hasNext) {
2524

2625
// Calculate hasNext from the available information
2726
// For Slice, hasNext is typically determined by whether we have more content
28-
super(content, PageRequest.of(number, size), hasNext);
27+
super(content, PageRequest.of(number, size), hasNext != null ? hasNext : !last);
2928
}
3029

3130
}

src/main/resources/application.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Server configuration
22
server.forward-headers-strategy=framework
33

4-
# Modern Couchbase configuration (Spring Boot 3.5+)
4+
# Modern Couchbase configuration (Spring Boot 4.0+)
55
spring.couchbase.connection-string=${DB_CONN_STR}
66
spring.couchbase.username=${DB_USERNAME}
77
spring.couchbase.password=${DB_PASSWORD}
@@ -13,3 +13,7 @@ spring.couchbase.env.timeouts.connect=10000ms
1313

1414
# Spring MVC configuration
1515
spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER
16+
17+
# springdoc-openapi 3.x - enable API docs (disabled by default in 3.x)
18+
springdoc.api-docs.enabled=true
19+
springdoc.swagger-ui.enabled=true

src/test/java/org/couchbase/quickstart/springdata/controllers/AirlineIntegrationTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
import org.junit.jupiter.api.Test;
1111
import org.springframework.beans.factory.annotation.Autowired;
1212
import org.springframework.beans.factory.annotation.Value;
13+
import org.springframework.boot.resttestclient.TestRestTemplate;
14+
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
1315
import org.springframework.boot.test.context.SpringBootTest;
14-
import org.springframework.boot.test.web.client.TestRestTemplate;
1516
import org.springframework.core.ParameterizedTypeReference;
1617
import org.springframework.dao.DataRetrievalFailureException;
1718
import org.springframework.http.HttpMethod;
@@ -25,6 +26,7 @@
2526

2627
@Slf4j
2728
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
29+
@AutoConfigureTestRestTemplate
2830
class AirlineIntegrationTest {
2931

3032
@Value("${local.server.port}")

src/test/java/org/couchbase/quickstart/springdata/controllers/AirportIntegrationTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
import org.junit.jupiter.api.Test;
1313
import org.springframework.beans.factory.annotation.Autowired;
1414
import org.springframework.beans.factory.annotation.Value;
15+
import org.springframework.boot.resttestclient.TestRestTemplate;
16+
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
1517
import org.springframework.boot.test.context.SpringBootTest;
16-
import org.springframework.boot.test.web.client.TestRestTemplate;
1718
import org.springframework.core.ParameterizedTypeReference;
1819
import org.springframework.dao.DataRetrievalFailureException;
1920
import org.springframework.http.HttpMethod;
@@ -27,6 +28,7 @@
2728

2829
@Slf4j
2930
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
31+
@AutoConfigureTestRestTemplate
3032
class AirportIntegrationTest {
3133

3234
@Value("${local.server.port}")

src/test/java/org/couchbase/quickstart/springdata/controllers/RouteIntegrationTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
import org.junit.jupiter.api.Test;
1313
import org.springframework.beans.factory.annotation.Autowired;
1414
import org.springframework.beans.factory.annotation.Value;
15+
import org.springframework.boot.resttestclient.TestRestTemplate;
16+
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
1517
import org.springframework.boot.test.context.SpringBootTest;
16-
import org.springframework.boot.test.web.client.TestRestTemplate;
1718
import org.springframework.core.ParameterizedTypeReference;
1819
import org.springframework.dao.DataRetrievalFailureException;
1920
import org.springframework.http.HttpMethod;
@@ -27,6 +28,7 @@
2728

2829
@Slf4j
2930
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
31+
@AutoConfigureTestRestTemplate
3032
class RouteIntegrationTest {
3133

3234
@Value("${local.server.port}")

0 commit comments

Comments
 (0)