Integração do Knife4j com Spring Boot para Documentação de API

O Knife4j é uma solução aprimorada para integrar a documentação da API Swagger em frameworks Java MVC. Anteriormente conhecido como swagger-bootstrap-ui, o Knife4j evoluiu de um mero tema para o Swagger UI para se tornar uma solução abrangente para serviços de documentação de API Swagger, com foco não apenas na interface do usuário, mas também em funcionalidades mais amplas.

Para integrar o Knife4j ao seu projeto Spring Boot, siga estas etapas:

1. Adicionar Dependência

Inclua a seguinte dependência no seu arquivo pom.xml:

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

2. Configurar o Arquivo YAML

Adicione as seguintes configurações ao seu arquivo application.yml (ou application.properties):

knife4j:
  # Habilita ou desabilita o Swagger
  enabled: true
  # Prefixo para os caminhos das APIs
  pathMapping: /api-docs
  # Habilita o modo aprimorado do Knife4j (padrão: false)
  enhance: true

Para mais detalhes sobre as configurações do modo aprimorado, consulte a documentação oficial.

3. Configurar o Knife4j

Crie uma classe de configuração para o Knife4j:

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
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.oas.models.SecuritySchemes;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spi.service.contexts.SecurityContext;
import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableKnife4j
public class SwaggerConfiguration {

    @Value("${knife4j.enabled}")
    private boolean swaggerEnabled;

    @Value("${knife4j.pathMapping}")
    private String apiPathPrefix;

    @Bean
    public Docket apiDocket() {
        return new Docket(DocumentationType.OAS_30)
                .enable(swaggerEnabled)
                .apiInfo(buildApiInfo())
                .groupName("v1") // Nome do grupo da API
                .select()
                // Seleciona APIs anotadas com @ApiOperation
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // Ou selecione todas as APIs em um pacote específico:
                // .apis(RequestHandlerSelectors.basePackage("com.example.controller"))
                .paths(PathSelectors.any())
                .build()
                .securityContexts(buildSecurityContexts())
                .pathMapping(apiPathPrefix);
    }

    private List<SecurityContext> buildSecurityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .operationSelector(operationContext -> operationContext.requestMappingPattern().matches("/api/.*")) // Exemplo: aplica a todas as rotas que começam com /api/
                        .build());
        return securityContexts;
    }

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope globalScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = {globalScope};
        List<SecurityReference> securityReferences = new ArrayList<>();
        // Assume que o token está sendo passado no cabeçalho "Authorization"
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }

    private ApiInfo buildApiInfo() {
        return new ApiInfoBuilder()
                .title("Documentação da API do Sistema de Gerenciamento")
                .description("API para gerenciamento de usuários e recursos.")
                .contact(new Contact("Desenvolvedores", null, "dev@example.com"))
                .version("1.0.0")
                .build();
    }
}

4. Liberar Requisições do Knife4j

Configure o Spring MVC para permitir o acesso aos recursos do Knife4j:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // Libera o acesso à interface do Swagger UI
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        // Libera o acesso aos arquivos webjars
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        // Libera o acesso à interface do Knife4j
        registry.addResourceHandler("doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");
    }
}

5. Anotar Interfaces com Comandos do Knife4j

Use as anotações do Swagger e do Knife4j para documentar seus controladores e modelos:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.bind.annotation.*;

@Api(tags = "Gerenciamento de Usuários")
@RestController
@RequestMapping("/users")
public class UserController {

    @ApiOperation(value = "Obtém informações do usuário por nome", response = String.class)
    @ApiImplicitParam(name = "userName", value = "Nome do usuário a ser buscado", required = true, dataType = "String", paramType = "query")
    @GetMapping("/getByName")
    public String getUserByName(@RequestParam("userName") String name) {
        return "User: " + name;
    }

    @ApiOperation(value = "Cria um novo usuário", response = String.class)
    @PostMapping("/create")
    public String createUser(@RequestBody UserDetails userDetails) {
        return "User " + userDetails.getName() + " created successfully.";
    }
}

Modelo de dados:

@ApiModel(description = "Detalhes do usuário")
@Data
public class UserDetails {

    @ApiModelProperty(value = "Nome do usuário", required = true)
    private String name;

    @ApiModelProperty(value = "Email do usuário", required = true)
    private String email;
}

6. Acessar a Página de Documentação

Após a configuração e execução da aplicação, acesse a documentação da API através do sgeuinte endereço:

http://localhost:8080/doc.html

(Substitua 8080 pela porta da sua aplicação, se for diferente).

Tags: Spring Boot Knife4j Swagger Documentação API java

Publicado em 9-3 19:47