digitalinnovationone / dio-springboot

650 stars 388 forks source link

springfox-swagger-ui não roda no VsCode #2

Open olgajuanne opened 1 year ago

olgajuanne commented 1 year ago

Erro no Terminal do Visual Studio Code.

2022-10-01 19:59:12.495  WARN 135008 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.toString()" because the return value of "springfox.documentation.spi.service.contexts.Orderings.patternsCondition(springfox.documentation.RequestHandler)" is null
2022-10-01 19:59:12.557  INFO 135008 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2022-10-01 19:59:12.663  INFO 135008 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-10-01 19:59:12.852 ERROR 135008 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.toString()" because the return value of "springfox.documentation.spi.service.contexts.Orderings.patternsCondition(springfox.documentation.RequestHandler)" is null
        at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.23.jar:5.3.23]
        at java.base/java.lang.Iterable.forEach(Unknown Source) ~[na:na]
        at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.23.jar:5.3.23]

O arquivo pom.xml com a dependência swagger:

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version> <!-- VSCode pede a  versão 3.0.0 -->
        </dependency>

Alterando a versão para 3.0.0 :

2022-09-29 15:58:22.474  WARN 29690 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/home/olga/.m2/repository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar!/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.class]; nested exception is java.lang.IllegalArgumentException: Unresolvable class definition for class [springfox.documentation.spring.web.OnServletBasedWebApplication]
2022-09-29 15:58:22.530  INFO 29690 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-09-29 15:58:22.717 ERROR 29690 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/home/olga/.m2/repository/io/springfox/springfox-spring-webmvc/3.0.0/springfox-spring-webmvc-3.0.0.jar!/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.class]; nested exception is java.lang.IllegalArgumentException: Unresolvable class definition for class [springfox.documentation.spring.web.OnServletBasedWebApplication]
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:457) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) ~[spring-context-5.3.23.jar:5.3.23]
        at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) ~[spring-context-5.3.23.jar:5.3.23]

Não entendi o que tenho que fazer para sair esse erro, e rodar a api.

tarcnux commented 1 year ago

Eu não analisei bem o seu caso, mas comigo também deu erro e encontrei esta solução no Stackoverflow https://stackoverflow.com/questions/40241843/failed-to-start-bean-documentationpluginsbootstrapper-in-spring-data-rest

Abre o seu application.properties e coloca a linha abaixo spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER

olgajuanne commented 1 year ago

Oi @tarcnux, essa solução não funcionou no meu, mas encontrei outra...

Solução que encontrei.

O spring-boot estava indicando erro na dependência swagger-ui, no terminal do VsCode, pesquise alguns artigos e achei um vídeo detalhando como fazer a modificação para fazer a aplicação rodar.

Devido erro de versão no Swagger, efetuei algumas mudanças nas dependências do arquivo pom.xml.

@EnableSwagger2 foi removido.

A versão Spring fox 3.0.0 não suporta o novo padrão spring-boot 2.6.0 e acima, no meu caso era a versão 2.7.4.

Modifiquei as versões e funcionou com essa:

 <parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId> 
   <version>2.5.2</version>
 </parent>

A dependência que não estava funcionando:

 <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>3.0.0</version>
   </dependency>
   <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>3.0.0</version>
   </dependency> 

Substituída por essa:

 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter -->
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-boot-starter</artifactId>
  <version>3.0.0</version>
</dependency>

Modificando também o link de acesso de http://localhost:8080/swagger-ui.html para http://localhost:8080/swagger-ui/index.html.

Meu projeto no Github (https://github.com/olgajuanne/cloud-parking)

O vídeo que me ajudo (https://youtu.be/pMXnR1T47e0)

tarcnux commented 1 year ago

Boa! Que bom que você correu atrás para resolver e não desistiu. Eu estou nos finalmentes no projeto cloud-parking. Espero concluir entre hoje ou amanhã.

viniciusbdzn commented 1 year ago

@olgajuanne Me ajudou muito, estava tentando de tudo pra fazer essa swagger-ui rodar.

Joshpcbrrj commented 1 year ago

@olgajuanne Esse video ajudou demais. Muito obrigado pela indicação e parabéns pela sua sagacidade na procura. Ps: No comentário do video eu acabei vendo uma outra solução sem que seja preciso alterar as dependências e incluindo uma indicação no @bean da classe "SwaggerConfig". Testei aqui e também funcionou, embora eu não tenha entendido bem como o código funciona exatamente. Mas pra quem estiver com o problema ai usando a dependência do springfox-swagger-ui 3.0.0 e springfox-swagger2 3.0.0 pode testar ai que também funciona. Segue:

Para rodar em versões do SB > 2.6.0 é preciso configurar assim:

========DEPENDÊNCIA===========

io.springfox springfox-boot-starter 3.0.0

=======ADICIONAR OS BEANS NA CLASSE DE CONFIG DO SWAGGER=====

@Bean

public InitializingBean removeSpringfoxHandlerProvider(DocumentationPluginsBootstrapper bootstrapper) {

    return () -> bootstrapper.getHandlerProviders().removeIf(WebMvcRequestHandlerProvider.class::isInstance);

}

@Bean

public RequestHandlerProvider customRequestHandlerProvider(Optional<ServletContext> servletContext, HandlerMethodResolver methodResolver, List<RequestMappingInfoHandlerMapping> handlerMappings) {

    String contextPath = servletContext.map(ServletContext::getContextPath).orElse(ROOT);

    return () -> handlerMappings.stream()

            .filter(mapping -> !mapping.getClass().getSimpleName().equals("IntegrationRequestMappingHandlerMapping"))

            .map(mapping -> mapping.getHandlerMethods().entrySet())

            .flatMap(Set::stream)

            .map(entry -> new WebMvcRequestHandler(contextPath, methodResolver, tweakInfo(entry.getKey()), entry.getValue()))

            .sorted(byPatternsCondition())

            .collect(toList());

}

RequestMappingInfo tweakInfo(RequestMappingInfo info) {

    if (info.getPathPatternsCondition() == null) return info;

    String[] patterns = info.getPathPatternsCondition().getPatternValues().toArray(String[]::new);

    return info.mutate().options(new RequestMappingInfo.BuilderConfiguration()).paths(patterns).build();

}