Versionado de API en Spring Framework 7
Reemplaza los controladores duplicados con prefijo de versión por el soporte nativo de versionado de API de Spring Framework 7.
// Version 1 controller
@RestController
@RequestMapping("/api/v1/products")
public class ProductControllerV1 {
@GetMapping("/{id}")
public ProductDtoV1 getProduct(
@PathVariable Long id) {
return service.getV1(id);
}
}
// Version 2 — duplicated structure
@RestController
@RequestMapping("/api/v2/products")
public class ProductControllerV2 {
@GetMapping("/{id}")
public ProductDtoV2 getProduct(
@PathVariable Long id) {
return service.getV2(id);
}
}
// Configure versioning once
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureApiVersioning(
ApiVersionConfigurer config) {
config.useRequestHeader("X-API-Version");
}
}
// Single controller, version per method
@RestController
@RequestMapping("/api/products")
public class ProductController {
@GetMapping(value = "/{id}", version = "1")
public ProductDtoV1 getV1(@PathVariable Long id) {
return service.getV1(id);
}
@GetMapping(value = "/{id}", version = "2")
public ProductDtoV2 getV2(@PathVariable Long id) {
return service.getV2(id);
}
}
Sin duplicación de controladores
Todas las versiones viven en una sola clase de controlador; solo los métodos handler individuales llevan un atributo de versión.
Estrategia de versión centralizada
Cambia de encabezado a URL o parámetro de consulta en una sola llamada a configureApiVersioning.
Evolución incremental
Añade una nueva versión a un método sin tocar endpoints no relacionados ni crear nuevos archivos de controlador.
Disponible desde Spring Framework 7.0 (requiere Java 17+)
Antes de Spring Framework 7, el versionado de API requería clases de controlador separadas por versión (por ejemplo, /api/v1/products, /api/v2/products), duplicando los mapeos de solicitudes y dispersando la lógica de versiones en muchos archivos. Spring Framework 7 introduce versionado nativo a través de un nuevo atributo version en @RequestMapping y anotaciones relacionadas, más un hook configureApiVersioning en WebMvcConfigurer. La versión puede resolverse desde un encabezado de solicitud, un segmento de ruta URL o un parámetro de consulta — todo controlado en un solo lugar.