Swagger перезаписывает методы с тем же путем и методом, но с разными параметрами

#spring-boot #swagger #spring-webflux #springfox

#spring-boot #swagger #spring-webflux #springfox

Вопрос:

Swagger перезаписывает методы с тем же путем и методом, но с разными параметрами

У меня есть приложение с Spring Boot 2.3.5.RELEASE, webflux и springfox 3.0.0. Я разработал два метода GET с тем же путем, но с разными параметрами, один не получает параметры и возвращает список и другие для findAll.

Дело в том, что Swagger генерирует документацию только по одному из методов, иногда листинг, другие страницы. Как я могу сказать swagger, что это разные методы, и документировать оба для меня?

Мой код контроллера:

 @GetMapping(value = "/foo", params = {"page", "size"})
@ResponseBody
public Mono<ResponseEntity<Mono<Page<FooDTO>>>> findByFilter(FooFilterDTO filter,
        @SortDefault(sort = "id", direction = Sort.Direction.DESC) @PageableDefault(value = 10) Pageable pageable) {
//...
}

@GetMapping(value = "/foo")
@ResponseBody
public Mono<ResponseEntity<Flux<FooDTO>>> findAll() {
//...
}
 

Моя конфигурация Swagger:

 @Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Value("${app.version}")
    private String version;
    
    @Bean
    public Docket docketUsersV1() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(this.fooApiInfo())
                .enable(true)
                .groupName("foo-api")
                .securityContexts(Arrays.asList(securityContext()))
                .securitySchemes(Arrays.asList(apiKey()))
                .select()
                .paths(fooPaths())
                .build();
    }
    
    private ApiInfo fooApiInfo() {
        return new ApiInfoBuilder()
                .title("Reactive Foo")
                .description("Reactive API")
                .version(appVersion)
                .build();
    }

    
    private Predicate<String> fooPaths() {
        return regex("/foo.*");
    }
}
 

Ответ №1:

Насколько я знаю, вы можете определить только один путь API с помощью каждого HTTP-глагола (GET, POST …), Независимо от необязательных параметров, отправляемых потребителем API.

Я бы посоветовал определить один путь GET / foo с необязательными параметрами page amp; size (т. е. не требуется)

Тогда у меня была бы одна функция точки входа в контроллере, а затем перенаправление на каждый findByFilter частный метод или findAll частный метод в зависимости от того page size , определены amp; или нет.

Комментарии:

1. Я бы хотел написать некоторый код, чтобы показать свою точку зрения, но, хотя у меня есть некоторый опыт работы с OpenAPI (Swagger), я никогда не работал с Spring.

2. Привет, это то, что я в итоге сделал. Spring позволяет вам определять несколько методов Java в одном и том же пути и методе HTTP и устанавливать условия для выбора того, какой из них использовать. В итоге мне пришлось объединить оба метода в один, и в зависимости от параметров я получаю список или страницу. Спасибо.