Springfox 3.0.0 funktioniert nicht mit Spring Boot 2.6.0 [duplicate]
Lesezeit: 9 Minuten
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
ℛɑƒæĿᴿᴹᴿ
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
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:
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
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);
}
}
};
}
}
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:
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. 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:
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.
Behalten Sie nur die oben genannte Abhängigkeit bei.
Entfernen Sie Bibliothekseinschlüsse früherer Versionen. Entfernen Sie insbesondere die Einschlüsse springfox-swagger2 und springfox-swagger-ui.
Entfernen Sie die @EnableSwagger2-Anmerkungen
Fügen Sie den Springfox-Boot-Starter hinzu
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
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.
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.
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