Swagger je nástroj (knihovna), který umožňuje dokumentovat REST endpointy vaší aplikace. Dobré je to například pro vývoj, kdy konzument (např. vývojář frontendu) ví, jaké jsou aktuálně k dispozici endpointy, jaké mají vstupy a jaké objekty vrací. Jak zprovoznit swagger v projektu, který používá WebFlux a Spring Boot ukáži v tomto příspěvku.
Pokud máte projekt a používáte pro restové služby framework WebFlux a Spring Boot, je zprovoznění Swaggeru jednoduché. Stačí přidat následující závislosti (používám Gradle a Kotlin):
implementation("io.springfox:springfox-swagger2:3.0.0-SNAPSHOT") implementation("io.springfox:springfox-swagger-ui:3.0.0-SNAPSHOT") implementation("io.springfox:springfox-spring-webflux:3.0.0-SNAPSHOT")
a vytvořit konfigurační třídu pro Swagger:
@Configuration @EnableSwagger2WebFlux class SwaggerConfiguration { @Bean fun api(): Docket { return Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()) .enableUrlTemplating(true) .enable(true) } private fun apiInfo(): ApiInfo { return ApiInfoBuilder() .title("Webflux springfox swagger application") .description("Project to show usage of swagger in webflux rest application") .version("1.0.0") .contact(Contact("vitfo", "www.vitfo.cz", "noemail")) .license("Apache License, Version 2.0") .licenseUrl("https://opensource.org/licenses/Apache-2.0") .build() } }
To je pro vygenerování té nejzákladnější funkcionality vše. Pokud nyní spustíte aplikaci, tak na stránce /swagger-ui.html
(http://localhost:8080/swagger-ui.html
) budete mít vygenerovanou dokumentaci. Například pro endpoint /message
, který vyžaduje parametr identifier
@GetMapping("/message") fun getMessageParam(@RequestParam identifier: String): Mono<ResponseEntity<Message>> { ... }
to bude vypadat následovně:
Je to alespoň něco, ale určitě by to mohlo být lepší. Pro to slouží anotace io.swagger.annotations
.
@ApiOperation (umožňuje přidat popis endpointu a specifikovat návratový typ)
@ApiOperation("Save message", response = String::class) @PostMapping("/message") fun saveMessage(@RequestBody messageToSave: Message): Mono<ResponseEntity<String>> { ... }
@ApiParam (umožňuje přidat popis a další informace k parametru)
@ApiOperation("Get message by its identifier", response = MessageV2::class) @GetMapping("/message_v2") fun getMessageParamDetailedInformation( @ApiParam(value = "Identifier of the message", name = "identifier", allowableValues = "m1 to m1000", example = "m100", allowEmptyValue = false) @RequestParam identifier: String): Mono<ResponseEntity<MessageV2>> { ... }
Díky ApiInfo, které jsme definovali v konfigurační třídě, se zobrazí tyto informace:
Celou aplikaci naleznete na githubu: github.com/vitfo/webflux-springfox-swagger