diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index e53f4e0f5d7b..c13362e0a5d5 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -25,7 +25,7 @@
spring-boot-annotations-2
spring-boot-artifacts
spring-boot-artifacts-2
- spring-boot-autoconfiguration
+ spring-boot-autoconfiguration
spring-boot-basic-customization
spring-boot-basic-customization-2
spring-boot-bootstrap
diff --git a/spring-boot-modules/spring-boot-mvc-5/pom.xml b/spring-boot-modules/spring-boot-mvc-5/pom.xml
index 497245a89320..e5144f30cc49 100644
--- a/spring-boot-modules/spring-boot-mvc-5/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-5/pom.xml
@@ -2,6 +2,7 @@
+
4.0.0
spring-boot-mvc-5
spring-boot-mvc-5
@@ -14,6 +15,22 @@
1.0.0-SNAPSHOT
+
+ 17
+ 17
+ 17
+ 17
+
+ 3.2.2
+ 3.0.0
+ 2023.0.0
+ 1.10
+ 1.10.0
+
+
+ com.baeldung.versioning.ApiVersioningDemoApplication
+
+
@@ -81,15 +98,4 @@
-
- 3.2.2
- 3.0.0
- com.baeldung.springboot.swagger.ArticleApplication
- 2023.0.0
- 1.10
- 17
-
- 1.10.0
-
-
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/ApiVersioningDemoApplication.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/ApiVersioningDemoApplication.java
new file mode 100644
index 000000000000..d3ae8173ce6c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/ApiVersioningDemoApplication.java
@@ -0,0 +1,11 @@
+package com.baeldung.versioning;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ApiVersioningDemoApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(ApiVersioningDemoApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/UserParamController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/UserParamController.java
new file mode 100644
index 000000000000..132df435b726
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/UserParamController.java
@@ -0,0 +1,27 @@
+package com.baeldung.versioning.controller;
+
+import com.baeldung.versioning.model.UserV2;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class UserParamController {
+
+@GetMapping("/api/users")
+public Object getUsers(@RequestParam(name = "version", defaultValue = "1") String version) {
+ if ("1".equals(version)) {
+ return List.of("Alice", "Bob");
+ } else if ("2".equals(version)) {
+ return List.of(
+ new UserV2("Alice", "alice@example.com", 30),
+ new UserV2("Bob", "bob@example.com", 25)
+ );
+ } else {
+ return "Unsupported API version";
+ }
+}
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/header/UserHeaderController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/header/UserHeaderController.java
new file mode 100644
index 000000000000..277385d58469
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/header/UserHeaderController.java
@@ -0,0 +1,27 @@
+// src/main/java/.../controller/header/UserHeaderController.java
+package com.baeldung.versioning.controller.header;
+
+import com.baeldung.versioning.model.UserV1;
+import com.baeldung.versioning.model.UserV2;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class UserHeaderController {
+
+ @GetMapping(value = "/api/users", headers = "X-API-VERSION=1")
+public List getUsersV1() {
+ return List.of(new UserV1("Alice"), new UserV1("Bob"));
+}
+
+@GetMapping(value = "/api/users", headers = "X-API-VERSION=2")
+public List getUsersV2() {
+ return List.of(
+ new UserV2("Alice", "alice@example.com", 30),
+ new UserV2("Bob", "bob@example.com", 25)
+ );
+}
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/mime/UserMimeController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/mime/UserMimeController.java
new file mode 100644
index 000000000000..dcd2038e5a8d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/mime/UserMimeController.java
@@ -0,0 +1,36 @@
+// src/main/java/com/baeldung/example/apiversioning/controller/mime/UserMimeController.java
+package com.baeldung.versioning.controller.mime;
+
+import com.baeldung.versioning.model.UserV1;
+import com.baeldung.versioning.model.UserV2;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class UserMimeController {
+
+ public static final String V1_MEDIA = "application/vnd.example.users-v1+json";
+ public static final String V2_MEDIA = "application/vnd.example.users-v2+json";
+
+ @GetMapping(value = "/api/users", produces = V1_MEDIA)
+ public List usersV1() {
+ return List.of(new UserV1("Alice"), new UserV1("Bob"));
+ }
+
+ @GetMapping(value = "/api/users", produces = V2_MEDIA)
+ public List usersV2() {
+ return List.of(
+ new UserV2("Alice", "alice@example.com", 30),
+ new UserV2("Bob", "bob@example.com", 25)
+ );
+ }
+
+ // Optional fallback
+ @GetMapping(value = "/api/users", produces = MediaType.APPLICATION_JSON_VALUE)
+ public List defaultUsers() {
+ return List.of(new UserV1("Alice"), new UserV1("Bob"));
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/negotiation/UserContentNegotiationController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/negotiation/UserContentNegotiationController.java
new file mode 100644
index 000000000000..592b0ed3cca7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/negotiation/UserContentNegotiationController.java
@@ -0,0 +1,20 @@
+package com.baeldung.versioning.controller.negotiation;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/users")
+public class UserContentNegotiationController {
+
+ @GetMapping(value = "/negotiation", produces = "application/vnd.col.users.v1+json")
+ public String getUsersV1() {
+ return "User list v1";
+ }
+
+ @GetMapping(value = "/negotiation", produces = "application/vnd.col.users.v2+json")
+ public String getUsersV2() {
+ return "User list v2";
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/v1/UserV1Controller.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/v1/UserV1Controller.java
new file mode 100644
index 000000000000..264be07d96d9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/v1/UserV1Controller.java
@@ -0,0 +1,14 @@
+package com.baeldung.versioning.controller.v1;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/v1/users")
+public class UserV1Controller {
+ @GetMapping
+ public String getUsersV1() {
+ return "User list from API v1";
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/v2/UserV2Controller.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/v2/UserV2Controller.java
new file mode 100644
index 000000000000..42550cd57b0d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/controller/v2/UserV2Controller.java
@@ -0,0 +1,14 @@
+package com.baeldung.versioning.controller.v2;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/v2/users")
+public class UserV2Controller {
+ @GetMapping
+ public String getUsersV2() {
+ return "User list from API v2 with extra fields";
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/model/UserV1.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/model/UserV1.java
new file mode 100644
index 000000000000..17abd7a4c05d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/model/UserV1.java
@@ -0,0 +1,9 @@
+package com.baeldung.versioning.model;
+
+public class UserV1 {
+ private String name;
+ public UserV1() {}
+ public UserV1(String name) { this.name = name; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/model/UserV2.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/model/UserV2.java
new file mode 100644
index 000000000000..dae73563b161
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/versioning/model/UserV2.java
@@ -0,0 +1,18 @@
+package com.baeldung.versioning.model;
+
+public class UserV2 {
+ private String name;
+ private String email;
+ private int age;
+
+ public UserV2(String name, String email, int age) {
+ this.name = name;
+ this.email = email;
+ this.age = age;
+ }
+
+ // getters
+ public String getName() { return name; }
+ public String getEmail() { return email; }
+ public int getAge() { return age; }
+}
\ No newline at end of file