Kotlin - Rest Api completa com Spring Boot, Swagger, Mysql e docker #03

Kotlin - Rest Api completa com Spring Boot, Swagger, Mysql e docker #03

Agora chegou o momento de configurarmos o nosso Swagger !

Primeiro, vamos configurar a dependência no gradle (build.gradle.kts):

implementation("io.springfox:springfox-swagger-ui:2.9.2")
implementation("io.springfox:springfox-swagger2:2.9.2")

A versão que deu certo por aqui foi a 2.9.2.

Vamos criar o arquivo de configuração do Swagger. Eu criei uma pasta chamada config e o arquivo dentro dela.

image.png

O arquivo de configuração deve ficar assim:

package com.kotlin.crudexample.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2

@Configuration
@EnableSwagger2
class SwaggerConfiguration {

    @Bean
    open fun api(): Docket = Docket(DocumentationType.SWAGGER_2)
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.kotlin.crudexample.controller"))
        .paths(PathSelectors.any())
        .build()
}

Repare que indicamos um caminho para que ele mostre somente os nossos controllers. Você pode também incluir mais informações da Api, ficaria da seguinte maneira:

package com.kotlin.crudexample.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import springfox.documentation.builders.ApiInfoBuilder
import springfox.documentation.builders.PathSelectors
import springfox.documentation.builders.RequestHandlerSelectors
import springfox.documentation.service.ApiInfo
import springfox.documentation.service.Contact
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2

@Configuration
@EnableSwagger2
class SwaggerConfiguration {

    @Bean
    open fun api(): Docket = Docket(DocumentationType.SWAGGER_2)
        .apiInfo(getApiInfo())
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.kotlin.crudexample.controller"))
        .paths(PathSelectors.any())
        .build()

    private fun getApiInfo(): ApiInfo {
        val contact = Contact("Rafael Moura", "rafaelmoura.dev", "teste@gmail.com")
        return ApiInfoBuilder()
            .title("Api Title")
            .description("Api Definition")
            .version("1.0.0")
            .license("Apache 2.0")
            .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
            .contact(contact)
            .build()
    }
}

Rode a aplicação e ao acessar http://localhost:8081/swagger-ui.html teremos a nossa documentação.

Ao expandir o product-controller, iremos reparar em todas operações que criamos dentro do controller. Para cada uma, teremos como testar passando um corpo ou parâmetro para filtrar se necessário. Podemos clicar em try it out em cada operação e testarmos se tudo está funcionando.

image.png

image.png

É isso!

Então criamos nossa Api Rest Springboot, utilizando o docker-compose para subirmos um Mysql e mostramos as rotas documentadas com o Swagger!

Agora podemos documentar as funções do Controller. Por exemplo, em getById:

@GetMapping("/product/{id}")
@ApiOperation(value = "Get Product by Id", response = Product::class)
fun getById(@PathVariable(value = "id") id: Long): Product = productService.getById(id)

Assim, no swagger irá exibir o valor para aquele operação:

image.png

Mão na massa e tente documentar tudo :)

Nossa serie termina aqui mas irei utilizar esse código para outros posts, como o de Testes Unitários. Fique de olho aqui no blog ;)

O código estará disponível aqui no meu github.

Dúvidas, críticas, comentários fiquem a vontade! Espero que tenham curtido e que o conteúdo possa ter contribuído de alguma forma em seus estudos.

Até mais!

Did you find this article valuable?

Support rafaelmoura.dev by becoming a sponsor. Any amount is appreciated!