3
respostas

Erro Swagger2 com SpringBoot 2.6+

To usando a versao 2.6.6 do Spring Boot e nessa versão mesmo colocando essa diretiva no arquivo de properties nao funcionou: spring.mvc.pathmatch.matching-strategy=ant_path_matcher

Só consegui resolver fazendo a troca do Swagger2 pro SpringDoc (https://springdoc.org/#Introduction). Mais especificamente a versao abaixo:

    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.6.7</version>
    </dependency>

Feito isso, é preciso adicionar as seguintes diretivas:

swagger-ui custom path

springdoc.swagger-ui.path=/swagger-ui.html springdoc.packagesToScan=br.com.alura.forum

Na classe de SwaggerConfiguration eu tive adicionar o seguinte codigo:

@Bean
public GroupedOpenApi publicApi() {
    return GroupedOpenApi.builder()
            .group("forumApi")
            .pathsToMatch("/**")
            .build();
}

@Bean
public OpenAPI forumAluraOpenAPI() {
    return new OpenAPI()
            .info(new Info().title("Forum API")
                            .description("Projeto de Documentacao de API da Alura")
                            .version("v0.0.1")
                            .license(new License().name("Apache 2.0").url("http://springdoc.org")))
            .components(new Components().addSecuritySchemes("bearer-key", new SecurityScheme().type(SecurityScheme.Type.HTTP)
                                                                                                  .scheme("bearer")
                                                                                                  .bearerFormat("JWT")))
            .externalDocs(new ExternalDocumentation()
                    .description("SpringShop Wiki Documentation")
                    .url("https://springshop.wiki.github.org/docs"));
}

E por fim ainda tive que ajustar o metodo configure() no SecurityConfiguration

    //Static resources configuration (css, js, img, etc.)
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
       .antMatchers("/**.html",
                               "/v3/api-docs/**",
                               "/webjars/**",
                               "/configuration/**",
                               "/swagger-resources/**",
                               "/swagger-ui/**");
}

Mas a mecanica de envio do Token JWT eu nao consegui reproduzir. Como seria isso nessa versao do SpringDoc?
3 respostas

Oi Fagner,

Realmente esse problema de compatibilidade das novas versões do Spring Boot com o Springfox está nos "forçando" a trocar pelo SpringDoc, infelizmente.

A parte de configurar o token você faz assim:

...
    .externalDocs(new ExternalDocumentation()
                    .description("SpringShop Wiki Documentation")
                    .url("https://springshop.wiki.github.org/docs"))
    .components(new Components()
        .addSecuritySchemes("bearer-key", new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").in(SecurityScheme.In.HEADER).bearerFormat("JWT")));

Bons estudos!

Troquei o Springfox pelo Springdoc com as configurações acima e funcionou tudo aqui, inclusive a autenticação, usando o botão "Authorize" - e nesse caso só precisa usar uma vez durante os testes da API, colocando o token sem o "Bearer"na frente - a interface guarda o token e não é necessário preencher um campo em cada requisição, como era no springfox.

Olá Fernando, obrigado por compartilhar a solução usando o SpringDoc

Eu segui o que você fez, porém ao accessar a página do swagger http://localhost:8080/swagger-ui.html está voltando erro 404, poderia me ajudar?

Classe SwaggerConfigurations

package br.com.alura.forum.config.swagger;

import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityScheme;

@Configuration
public class SwaggerConfigurations {

    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder()
                .group("forumApi")
                .pathsToMatch("/**")
                .build();
    }

    @Bean
    public OpenAPI forumAluraOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("Forum API")
                                .description("Projeto de Documentacao de API da Alura")
                                .version("v0.0.1")
                                .license(new License().name("Apache 2.0").url("http://springdoc.org")))
                .components(new Components().addSecuritySchemes("bearer-key", new SecurityScheme().type(SecurityScheme.Type.HTTP)
                                                                                                      .scheme("bearer")
                                                                                                      .bearerFormat("JWT")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringShop Wiki Documentation")
                        .url("https://springshop.wiki.github.org/docs"))
                .components(new Components()
                        .addSecuritySchemes("bearer-key", new SecurityScheme().type(SecurityScheme.Type.HTTP)
                                .scheme("bearer").in(SecurityScheme.In.HEADER)
                                .bearerFormat("JWT")));
    }
}

Classe SecurityConfigurations método configure

//Configurações de recursos estáticos(requisições para arquivos js, css, imagens, etc.)
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
            .antMatchers("/**.html",
                    "/v3/api-docs/**",
                    "/webjars/**",
                    "/configuration/**",
                    "/swagger-resources/**",
                    "/swagger-ui/**");
    }

Desde já agradeço