[JAVA] Statische Ressourcen konnten nicht über WebFlux verteilt werden, als @EnableWebFlux in Spring Boot gewährt wurde

Fazit

Bei Verwendung von Spring WebFlux ab Spring Boot 2.3.4.RELEASE Wenn Sie die Annotation "@ EnableWebFlux" verwenden, können Sie keine statischen Ressourcen verteilen.

Zusammenfassung

Es wurde beschlossen, zum ersten Mal seit mehreren Jahren einen WEB-Server zu entwickeln. Es ist schon eine Weile her, dass ich Java- und WEB-Server entwickelt habe, also habe ich mich für Spinrg Boot entschieden, das viele Informationen enthält.

Spring WebFlux wurde dem Spring Framework hinzugefügt, während ich eine Weile kein Java verwendete Ich habe mich für WebFlux entschieden, weil es eine große Sache war.

Nachdem Sie die Spring WebFlux-Dokumentation zum ersten Mal gelesen haben, Die Anwendung wurde automatisch mit Spring Boot konfiguriert.

Zu diesem Zeitpunkt gab es keine größeren Probleme bei der Verwendung von WebFlux, aber es wurde notwendig, statische Ressourcen später zu verteilen.

Es scheint, dass statische Ressourcen auf dieselbe Weise wie Spring MVC verteilt werden können, wenn WebFlux in Spring Boot konfiguriert ist. Ich dachte, wenn ich die Ressource in "classpath: / static /" platziere und mit einem WEB-Browser darauf zugreife, wird eine Antwort vom Server zurückgegeben, aber 404 Not Found wird zurückgegeben.

Ich habe mich gefragt, ob ich einen Fehler gemacht und die Spring Boot-Dokumentation durchsucht habe, aber es heißt, dass dies möglich ist / htmlsingle / # boot-features-webflux-auto-configuration).

Statische Ressourcen, die laut Dokumentation nicht verteilt sind, werden nicht verteilt. Ich habe den Grund nicht verstanden und daher die WebFlux-bezogene automatische Konfiguration von Spring Boot überprüft.

Suchen Sie eine Konfiguration für die Verteilung statischer Ressourcen mit WebFlux WebFlux Auto Configurationを発見した。

Es scheint, dass die statische Ressourcenzuordnung mit "WebFluxConfig # addResourceHandlers (ResourceHandlerRegistry)" hinzugefügt wird Fügen Sie an zwei Stellen Haltepunkte hinzu: "WebFluxConfig # addResourceHandlers (ResourceHandlerRegistry)" und "WebFlux" -Konstruktor. Schließen Sie den Debugger an und starten Sie die Anwendung. Der Haltepunkt wurde jedoch nicht erreicht, als die Anwendung beendet wurde.

Wenn die automatische Konfiguration von Spring Boot nicht aufgerufen wird, liegt dies normalerweise an einem Mangel an "@ Bean" oder an fehlenden Bibliotheken, die die Bedingungen für die Ausführung der automatischen Konfiguration nicht erfüllen.

Als ich mir die Spring Boot-Dokumentation noch einmal ansah und dachte, ich hätte etwas übersehen, Mir ist aufgefallen, dass das Dokument die Ursache klar angibt.

Ursache

Spring Boot implementiert die WebFlux-Konfiguration mit "WebFluxAutoConfiguration". Diese Klasse erhält "@ConditionalOnMissingBean ({WebFluxConfigurationSupport.class})" Wenn eine andere WebFluxConfigurationSupport-Implementierung bei @ Bean registriert ist, wird diese automatische Konfiguration nicht ausgeführt.

Überprüfen Sie die Definition von @ EnableWebFlux(https://github.com/spring-projects/spring-framework/blob/69921b49a5836e412ffcd1ea2c7e20d41f0c0fd6/spring-webflux/src/main/java/org/springframework/) /EnableWebFlux.java#L90) "@Import (DelegatingWebFluxConfiguration.class)" wird angegeben. DaDelegatingWebFluxConfiguration eine Implementierung von WebFluxConfigurationSupport` ist, Die von Spring Boot bereitgestellte "WebFluxAutoConfiguration" funktioniert aufgrund der "ConditionalOnMissingBean" nicht als automatische Konfiguration.

Seit ich "@ EnableWebFlux" zur "@ Configuration" -Klasse im Spring WebFlux-Dokument hinzugefügt habe, habe ich zuerst gelesen. Ich war überzeugt, dass ich es gewähren musste, um die WebFlux-Anwendung zu implementieren.

Spring Boot bietet jedoch einen eigenen "WebFluxConfigurationSupport", um WebFlux Funktionen hinzuzufügen Es gab eine Regel, dass "@ EnableWebFlux" nicht hinzugefügt werden sollte, wenn WebFlux in Spring Boot aktiviert wird.

Die Spezifikationen hier wurden fest in der Spring Boot-Dokumentation (https://docs.spring.io/spring-boot/docs/2.3.4.RELEASE/reference/htmlsingle/#boot-features-) geschrieben. Webflux-Auto-Konfiguration), aber Ich habe es übersprungen, weil es nach dem Lesen der Spring WebFlux-Dokumentation war.

Beiseite

Spring Boot erkennt die Klassenpfadbibliothek und entscheidet, ob Spring MVC oder Spring WebFlux als WEB-Server konfiguriert werden sollen.

Wenn sich nun sowohl die Spring MVC- als auch die Spring WebFlux-Bibliotheken im Klassenpfad befinden, Wie kann ich den zu aktivierenden WEB-Server steuern? Ich habe es nur für den Fall überprüft und "REACTIVE" in der Eigenschaft "spring.main.web-application-type" von Spring Boot angegeben. Sie können Ihre Anwendung anscheinend mit WebFlux konfigurieren.

Beurteilung des Einstellungsstatus von spring.main.web-application-type ist Dies erfolgt mit der Annotation "@ConditionalOnWebApplication (type = ConditionalOnWebApplication.Type.REACTIVE)" für "WebFluxAutoConfiguration".

Wenn Sie Spring MVC verwenden möchten, geben Sie "SERVLET" in "spring.main.web-application-type" an.

Recommended Posts

Statische Ressourcen konnten nicht über WebFlux verteilt werden, als @EnableWebFlux in Spring Boot gewährt wurde
Geben Sie die statische Ressourcencodierung in Spring Boot an
JSESSIONID konnte bei Verwendung von Spring Security nicht der URL zugewiesen werden
Statische Dateizugriffspriorität beim Spring Boot
Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Wenn @Transactional of Spring Boot nicht funktioniert
Passen Sie die Anzeige an, wenn im Spring Boot ein Fehler wie 404 Not Found auftritt