#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 и устанавливать условия для выбора того, какой из них использовать. В итоге мне пришлось объединить оба метода в один, и в зависимости от параметров я получаю список или страницу. Спасибо.