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