Spring Framework 7 üzerine inşa edilen Spring Boot 4 üzerinde birkaç güzel özellik bulunmaktadır sırasıyla tek tek inceleyelim.

Native API Versioning

En güzel özelliklerden birisidir. Normalde Spring Boot 4 öncesinde bizler şunları yapıyorduk.

@RequestMapping(method = RequestMethod.GET,"/api/v1/users")
@RequestMapping(method = RequestMethod.GET,"/api/v2/users")

Bunu hard code bir şekilde her URL pathine vermek zorundaydık. Eğer ki versiyonlamayı değiştirmek isteseydik örneğin v1 kısmını header'a çekmek isteseydik:

X-API-VERSION: 1

şeklinde bunu tekrardan her bir controller'a tek tek yazmak zorundaydık bunun yerine:

Spring Boot amcamız bizim için Native API Versioning özelliğini getirdi çok güzel özelliktir şimdi buna değinelim.

Spring Boot 4 bizler için @RequestMapping yada @GetMapping'e eklemek için version attributesini getirdi. Biz basit bir şekilde api'de kullanmak istediğimiz versiyonun sayısını veriyoruz spring bunu bizim için hallediyor.


Bir classta birden fazla versiyon bulundurma

Varsayalım hello isimli bir endpointimiz olsun. V1 ve V2 versiyonlarında da farklı cevaplar versin bize, bunu kodlamak için:

@RestController
@RequestMapping("/hello")
public class HelloWorldController {
 
    // /api/v1/hello
    @RequestMapping(method = RequestMethod.GET, version = "1", produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHelloV1() {
        return "Minter Coder Version 1";
    }
 
    // /api/v2/hello
    @RequestMapping(method = RequestMethod.GET, version = "2", produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHelloV2() {
        return "Minter Coder Version 2";
    }
 
}


Görüldüğü üzere sonunda artık URL adresleri bu şekilde olur.

V1 -> /api/v1/hello

V2 -> /api/v2/hello


Bütün classı versiyonlama

Eğer ki bütün classın versiyonunu belirtmek istersek bunun için de class bazında version attributesini kullanmamız yeterlidir.

@RestController
@RequestMapping(path = "/hello", version = "3")
public class HelloWorldControllerV3 {
    
    @RequestMapping(produces = MediaType.TEXT_PLAIN_VALUE)
    public String sayHello(){
        return "Minter Coder versiyon 3";
    }
 
}

Burda da artık

V3 -> /api/v3/hello

şeklinde olur.

Artık biz bu versiyonlamaları belirttik ve bunları artık user nasıl bizden isteyecek bunu da belirtmemiz gerekiyor configuration dosyamızda.


@Configuration
public class ApiConfig implements WebMvcConfigurer {
 
    @Override
    public void configureApiVersioning(ApiVersionConfigurer configurer) {
        // URL'de Spring'e hangi versiyonu kullanmamız gerektiğini söylüyoruz.
        configurer.usePathSegment(1);
    }
 
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // Burda da dynamic olarak URL yapısını bizim için oluşturacak.
        // "v{version}" burda v1,v2,v3 otomatik bir şekilde olacaktır.
        configurer.addPathPrefix("/api/v{version}", HandlerTypePredicate.forAnnotation(RestController.class));
    }
 
}


Görüldüğü üzere biz burada /api/v{version}/endpoints şeklinde andık artık bütün süreçler böyle dönecek örneğin:

/api/v1/hello