Search code examples
springswaggerspringdocspringdoc-openui

Keep same URL but contract changes in Spring Boot REST Open API 3?


I am using Spring Boot and REST and Open API 3 implementation. In this example, v1 Group has List implementation - all data will get in List, in v2 Group has pagination implementation - all data will come in the form of pages.

For the consumer, we don't want to change endpoint url for them to be consume.

Endpoint which returns list.

@GetMapping(value = "/contacts", headers = {"Accept-version=v1"})
public ResponseEntity<List<Contact>> findAll() {
    List<Contact> contacts = contactService.findContactList();
    return new ResponseEntity<>(contacts, HttpStatus.OK);
}

Endpoint with Pagination

@GetMapping(value = "/contacts", headers = {"Accept-version=v2"})
public ResponseEntity<List<Contact>> findAll(Pageable pageable) {
    Page<Contact> contactPages = contactService.findContactPageable(pageable);
    return new ResponseEntity<>(contactPages, HttpStatus.OK);
}

I want V1 endpoint to be shown in GroupedOpenApi and v2 endpoint to be shown in the GroupedOpenApi2. Any suggestions ?


Solution

  • Lets assume you put the two endpoints in different packaged and then use the Following GroupedOpenApi definition:

    @Bean
    public GroupedOpenApi groupOpenApiV1() {
        return GroupedOpenApi.builder()
                .setGroup("v1")
                .packagesToScan("test.org.springdoc.api.v1")
                .build();
    }
    
    @Bean
    public GroupedOpenApi groupOpenApiV2() {
        return GroupedOpenApi.builder()
                .setGroup("v2")
                .packagesToScan("test.org.springdoc.api.v2")
                .build();
    }