Как настроить SpringFox для отображения двух (или более) версий API Rest с помощью Spring Boot? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь выяснить, как управлять двумя (или более) версиями моих конечных точек API с помощью Spring Fox.

Для управления версиями моих API я использую Управление версиями посредством согласования содержимого , также известный как Управление версиями с использованием заголовка Accept .Версии каждой конечной точки контролируются индивидуально с использованием информации заголовка.Например, для первой версии я использую атрибут produces:

@Override
@PostMapping(
        produces = "application/vnd.company.v1+json")
public ResponseEntity<User> createUser(

Для второй версии я использую:

@Override
@PostMapping(
        produces = "application/vnd.company.v2+json",
        consumes = "application/vnd.company.v2+json")
public ResponseEntity<User> createUserVersion2(

Я не использую consumes для первого (v1) версия, поэтому, если клиент использует только application/json для вызова, первая версия будет вызываться по умолчанию.

Я хотел бы показать две версии в пользовательском интерфейсе Swagger.Как это сделать?

1 Ответ

0 голосов
/ 04 декабря 2018

Это очень просто.Просто создайте один Docket для каждой версии.

Пример, первая версия:

@Bean
public Docket customImplementation(
        @Value("${springfox.documentation.info.title}") String title,
        @Value("${springfox.documentation.info.description}") String description) {

    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo(title, description, "1.0"))
            .groupName("v1")
            .useDefaultResponseMessages(false)
            .securitySchemes(newArrayList(apiKey()))
            .pathMapping("/api")
            .securityContexts(newArrayList(securityContext())).select()
            .apis(e -> Objects.requireNonNull(e).produces().parallelStream()
                    .anyMatch(p -> "application/vnd.company.v1+json".equals(p.toString())))
            .paths(PathSelectors.any())
            .build();
}

А для второй версии:

@Bean
public Docket customImplementationV2(
        @Value("${springfox.documentation.info.title}") String title,
        @Value("${springfox.documentation.info.description}") String description) {

        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo(title, description, "2.0"))
                .groupName("v2")
                .select()
                .apis(e -> Objects.requireNonNull(e).produces()
                        .parallelStream()
                        .anyMatch(p -> "application/vnd.company.v2+json".equals(p.toString())))
                .build();
}

Секрет здесь заключается в фильтрации доступныхконечные точки с атрибутом produces.

Swagger-UI покажет две версии в комбо:

enter image description here

Этот коддолжен быть в классе, помеченном @Configuration.Вам также нужно включить Swagger с @EnableSwagger2.

...