Springfox 3.0.0 funktioniert nicht mit Spring Boot 2.6.0 [duplicate]

Lesezeit: 9 Minuten

Thirumals Benutzeravatar
Thirumal

Springfox 3.0.0 funktioniert nicht mit Spring Boot 2.6.0. Nach dem Upgrade erhalte ich die folgende Fehlermeldung

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181)
    at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54)
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
    at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290)
    at com.enkindle.AntivirusApplication.main(AntivirusApplication.java:16)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
    at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56)
    at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113)
    at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89)
    at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:473)
    at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.base/java.util.TimSort.sort(TimSort.java:234)
    at java.base/java.util.Arrays.sort(Arrays.java:1307)
    at java.base/java.util.ArrayList.sort(ArrayList.java:1721)
    at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:392)
    at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
    at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
    at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
    at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider.requestHandlers(WebMvcRequestHandlerProvider.java:81)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.withDefaults(AbstractDocumentationPluginsBootstrapper.java:107)
    at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.buildContext(AbstractDocumentationPluginsBootstrapper.java:91)
    at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.bootstrapDocumentationPlugins(AbstractDocumentationPluginsBootstrapper.java:82)
    at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:100)
    at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
    ... 19 common frames omitted

  • Ich habe dieses Problem auch mit SpringBoot 2.6.1 (springfox-boot-starter 3.0.0)

    – Nicolas

    9. Dezember 2021 um 17:12 Uhr

  • Nur das Hinzufügen von @EnableWebMvc in der Hauptklasse hat das Problem behoben. stackoverflow.com/a/70703081/5626568

    – ℛɑƒæĿᴿᴹᴿ

    16. März 2022 um 11:01 Uhr


ℛɑƒæĿᴿᴹᴿs Benutzeravatar
ℛɑƒæĿᴿᴹᴿ

Nur hinzufügen @EnableWebMvc in der Hauptklasse das Problem gelöst:

@EnableWebMvc
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class);
    }
}

  • Ich mag Lösungen, die weniger als 2 Zeilen Code umfassen. Gut.

    – Coretechie

    12. August 2022 um 9:04 Uhr

Ich weiß, dass dies Ihr Problem nicht direkt löst, aber denken Sie über einen Wechsel nach Springdoc welche neueste Veröffentlichung unterstützt Spring Boot 2.6.0. Springfox ist zu diesem Zeitpunkt so fehlerhaft, dass die Verwendung mühsam ist. Ich bin umgezogen springdoc Vor 2 Jahren wegen der Spring WebFlux-Unterstützung und ich bin sehr glücklich darüber. Darüber hinaus unterstützt es auch Kotlin-Coroutinen, was Springfox meiner Meinung nach nicht tut.

Wenn Sie sich für eine Migration entscheiden, springdoc hat sogar eine Migrationsleitfaden.

  • Wenn ich könnte, hätte ich 100 Mal abgestimmt 🙂 Wir haben genau die gleiche Entscheidung getroffen und (fast) alle dummen Probleme, die wir mit Springfox hatten, beseitigt!

    – Honza Zidek

    3. Februar 2022 um 22:54

  • Abgestimmt, KIV-ed und dieser Antwort gefolgt (Ich brauche Springdoc jetzt nicht, da ich eine niedrigere Version von Spring Boot verwende, werde es aber wahrscheinlich tun)

    – jumping_monkey

    9. Februar 2022 um 6:14


Benutzer-Avatar von Peter Keller
Peter Keller

Bisher funktioniert Springfox 3.0.0 nur mit Spring 2.6.0-M2, nicht jedoch mit den höheren Versionen. Siehe die offene Springfox-Ausgabe https://github.com/springfox/springfox/issues/3462. Dort finden Sie auch einige Problemumgehungen, die Sie verwenden können, bis das Problem behoben ist.

Fügen Sie beispielsweise dies hinzu Bean zu Ihrer Swagger-Konfiguration:

@Bean
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
    return new BeanPostProcessor() {

        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
            }
            return bean;
        }

        private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
            List<T> copy = mappings.stream()
                .filter(mapping -> mapping.getPatternParser() == null)
                .collect(Collectors.toList());
            mappings.clear();
            mappings.addAll(copy);
        }

        @SuppressWarnings("unchecked")
        private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
            try {
                Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                field.setAccessible(true);
                return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                throw new IllegalStateException(e);
            }
        }
    };
}

BEARBEITEN: Der Server startet, aber es werden keine API-Informationen zurückgegeben:

In der Spezifikation sind keine Operationen definiert!

Was für ein Chaos.

EDIT 2: Wie von @Héctor erwähnt, spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER muss ergänzt werden application.properties und die Vorgänge werden erneut angezeigt. Allerdings weiß ich nicht, ob das Setzen dieser Eigenschaft in allen Fällen möglich ist, da es andere Einschränkungen beeinträchtigen könnte.

  • Ich habe in dieser URL die letzte Lösung gefunden: Fügen Sie „spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER“ zu Ihren application.properties hinzu. Das ist alles

    – Héctor

    15. Dezember 2021 um 14:32 Uhr

  • @Héctor: Danke für deinen Beitrag. Allerdings musste ich das definieren BeanPostProcessor und hinzuzufügen ANT_PATH_MATCHER. Nur hinzufügen ANT_PATH_MATCHER führen zu demselben Fehler wie von @Thirumal angegeben.

    – Peter Keller

    20. Dezember 2021 um 7:01 Uhr

  • Die Rückkehr zu 2.5.3 funktioniert

    – dgupta3091

    4. Februar 2022 um 9:24

  • Leider werden durch diese Konfiguration die Swagger-Dokumente für den Actuator Controller /actuator/health und /actuator/prometueus vollständig entfernt. Wenn Sie diese Controller in Ihrem Springfox-JSON-Dokument benötigen, verwenden Sie diese Problemumgehung: github.com/springfox/springfox/issues/… Hat bei mir mit Spring 2.6.6 und Springfox 2.9.2 funktioniert

    – Elektrobabe

    19. April 2022 um 10:34 Uhr

Benutzeravatar von Gabriel Hernandez
Gabriel Hernandez

Verwenden Sie für Springfox 3.0.0 und Springboot 2.6.1 diese Konfiguration und fügen Sie dieses Tag @Configuration @EnableWebMvc hinzu

public class SpringFoxConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.any())
                .build().apiInfo(getApiInfo());
    }
    
    private ApiInfo getApiInfo() {
        return new ApiInfo(
                "Api Usuarios",
                "prueba global logic",
                "1",
                "TERMS OF SERVICE URL",
                new Contact("Gabriel Hernández","URL","[email protected]"),
                "LICENSE",
                "LICENSE URL",
                Collections.emptyList()
        );
    }
    
    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {

            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider ) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
                List<T> copy = mappings.stream()
                    .filter(mapping -> mapping.getPatternParser() == null)
                    .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            @SuppressWarnings("unchecked")
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }    
}

Benutzeravatar von huguinho27
huguinho27

Eine mögliche Lösung ist:

1- Aufstellen spring.mvc.pathmatch.matching-strategy: ant_path_matcher In application.properties

2- Fügen Sie Ihrer SwaggerConfig-Klasse die folgende Bean hinzu:

@Bean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties, Environment environment) {
        List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
        Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
        allEndpoints.addAll(webEndpoints);
        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
        String basePath = webEndpointProperties.getBasePath();
        EndpointMapping endpointMapping = new EndpointMapping(basePath);
        boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
        return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null);
    }


private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
        return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
    }

Anerkennung an hhhhsw

  • Das hilft, vielen Dank. Aber könnten Sie bitte etwas erklären, was diese Magie bewirkt?

    – Andriy Slobodyanyk

    25. Juli 2022 um 16:10 Uhr

  • Hey @AndriySlobodyanyk, wie im Beitrag angegeben, stammt das ursprünglich von github.com/hhhhsw. Ich hatte keine Gelegenheit herauszufinden, warum es mit seinem Fix funktionierte.

    – huguinho27

    26. Juli 2022 um 12:20 Uhr

Mohamad J Alanbakis Benutzeravatar
Mohamad J. Alanbaki

Ich hatte im letzten Projekt das gleiche Problem und es scheint, dass die Springfox-Abhängigkeit mit Spring 2.6.x ein Problem hatte. Ich habe herausgefunden, was das Problem mit der Springfox-Abhängigkeit ist. Alle Spring-Entwickler haben nach Spring 2.6.X mit dem gleichen Problem zu kämpfen

Daher geben alle die Empfehlung, auf Springdoc zu migrieren. hier findest du alles:

https://springdoc.org/#migrating-from-springfox

  • Das hilft, vielen Dank. Aber könnten Sie bitte etwas erklären, was diese Magie bewirkt?

    – Andriy Slobodyanyk

    25. Juli 2022 um 16:10 Uhr

  • Hey @AndriySlobodyanyk, wie im Beitrag angegeben, stammt das ursprünglich von github.com/hhhhsw. Ich hatte keine Gelegenheit herauszufinden, warum es mit seinem Fix funktionierte.

    – huguinho27

    26. Juli 2022 um 12:20 Uhr

Migrationsschritte:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  1. Behalten Sie nur die oben genannte Abhängigkeit bei.
  2. Entfernen Sie Bibliothekseinschlüsse früherer Versionen. Entfernen Sie insbesondere die Einschlüsse springfox-swagger2 und springfox-swagger-ui.
  3. Entfernen Sie die @EnableSwagger2-Anmerkungen
  4. Fügen Sie den Springfox-Boot-Starter hinzu
  5. Springfox 3.x entfernt Abhängigkeiten von Guava und anderen Bibliotheken von Drittanbietern (noch nicht Zero Dep! Hängt vom Spring-Plugin und offenen API-Bibliotheken für Annotationen und Modelle ab). Wenn Sie also Guava-Prädikate/-Funktionen verwendet haben, müssen diese auf Java 8-Funktionsschnittstellen umgestellt werden
  6. Wenn Sie WebMvc verwenden und es sich um ein Nicht-Springboot-Projekt handelt, Sie aber die Annotation @EnableWebMvc noch nicht verwenden, fügen Sie diese Annotation hinzu.

Quelle: doc_link

  • Für die überwiegende Mehrheit der Menschen fügt man hinzu @EnableWebMvc zu einer Spring Boot-App hinzuzufügen, ist falsch, da dadurch die automatische Konfiguration von Spring MVC durch Spring Boot deaktiviert wird.

    – Andy Wilkinson

    1. Dezember 2021 um 11:32 Uhr

  • Die Verwendung von SNAPSHOT-Versionen externer Abhängigkeiten ist keine gute Idee. Dies macht den Aufbau auf möglicherweise sehr überraschende Weise unwiederholbar.

    – Henning

    4. Dezember 2021 um 20:24

  • Ich stimme bis Punkt 5 zu. Sie müssen diese Eigenschaft zu Ihren application.properties hinzufügen: spring.mvc.pathmatch.matching-strategy=ant_path_matcher Sie können hier mehr darüber lesen: github.com/spring-projects/spring-boot/issues/28874 spring.io/blog/2020/06/30/…

    – Tomas Pinto

    2. Juni 2022 um 14:29

1453080cookie-checkSpringfox 3.0.0 funktioniert nicht mit Spring Boot 2.6.0 [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy