Trong bài viết trước, mình đã hướng dẫn các bạn cách enable API Versioning cho request header trong Spring application. Ở bài viết này, chúng ta sẽ cùng tiếp tục tìm hiểu cách enable API Versioning này cho path parameter các bạn nhé!
Mình cũng sẽ tạo mới một Spring Boot project với Spring Web dependency như sau:

Như mình cũng đã lưu ý với các bạn trong bài viết trước, chúng ta cũng cần sử dụng Spring Boot 4 với Spring Framework 7 trở đi các bạn nhé!
Lúc trước, khi cần định nghĩa version cho 1 endpoint trong Spring MVC sử dụng path parameter, chúng ta sẽ định nghĩa nó cùng với endpoint URL, ví dụ như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.huongdanjava.springboot; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/v1.0.0/hello") public String hello() { return """ { "message": "Hello from Huong Dan Java!" } """; } } |
Với sự support API versioning từ Spring framework 7 thì việc định nghĩa version cho các endpoint sẽ dễ dàng hơn, linh hoạt hơn.
Để enable versioning cho các endpoint với path parameter, tương tự như cho request header, các bạn cũng cần implement interface WebMvcConfigurer, override phương thức configureApiVersioning() và sử dụng phương thức usePathSegment() như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.huongdanjava.springboot; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ApiVersionConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureApiVersioning(ApiVersionConfigurer configurer) { configurer.usePathSegment(0) .setDefaultVersion("1.0.0"); } } |
Giá trị của tham số trong phương thức usePathSegment() là segment chứa thông tin version trong endpoint. Có những endpoint ví dụ như /v1.0.0/hello thì giá trị segment là 0, còn endpoint /api/v1.0.0/hello thì segment thì lại là 1 nên tuỳ theo nhu cầu thì các bạn hãy truyền cho đúng giá trị segment này các bạn nhé! Cho ví dụ của mình thì segment sẽ có giá trị là 0.
Ở đây, mình cũng sử dụng phương thức setDefaultVersion() để định nghĩa version mặc định cho những endpoint nào không định nghĩa thông tin version.
Với Spring Boot project thì thay vì implement interface WebMvcConfigurer, các bạn cũng có thể sử dụng các properties như sau:
|
1 2 3 4 5 6 |
spring: mvc: apiversion: use: path-segment: 0 default: 1.0.0 |
Để chỉ định version cho một endpoint bất kỳ, các bạn có thể sử dụng thuộc tính version của các annotation @GetMapping, @PostMapping, …. Ví dụ như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com.huongdanjava.springboot; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/v{version}") public class HelloController { @GetMapping("/hello") public String hello() { return """ { "message": "Hello from Huong Dan Java!" } """; } @GetMapping(value = "/hello", version = "1.1.0") public String hello1_1() { return """ { "message": "Hello from Huong Dan Java! V1.1.0" } """; } } |
Ở đây, mình cũng annotate thêm cho class HelloController với annotation @RequestMapping để định nghĩa prefix cho tất cả các endpoint trong class này, bắt đầu với “/v{version}”.
Lúc này, nếu chạy ứng dụng và request tới endpoint /v1.0.0/hello, kết quả các bạn sẽ thấy như sau:

Như các bạn thấy, phương thức hello() trong class HelloController sẽ handle request vì nó không được định nghĩa version, nên mặc định sẽ được gán version là 1.0.0.
Nếu request tới endpoint thì /v1.1.0 thì kết quả sẽ như sau:


