Lors de l'utilisation de Spring WebFlux à partir de Spring Boot 2.3.4.
L'utilisation de l'annotation @ EnableWebFlux
vous empêchera de distribuer des ressources statiques.
Il a été décidé de développer un serveur WEB pour la première fois depuis plusieurs années. Cela faisait un moment que je n'avais pas développé de serveur Java et WEB, j'ai donc décidé d'utiliser Spinrg Boot, qui contient beaucoup d'informations.
Depuis que Spring WebFlux a été ajouté à Spring Framework alors que je n'utilisais pas Java pendant un certain temps, J'ai décidé d'utiliser WebFlux parce que c'était un gros problème.
Après avoir lu la documentation Spring WebFlux pour la première fois, L'application a été automatiquement configurée avec Spring Boot.
À ce stade, il n'y avait aucun problème majeur avec l'utilisation de WebFlux, mais il est devenu nécessaire de distribuer des ressources statiques plus tard.
Il semble que les ressources statiques peuvent être distribuées de la même manière que Spring MVC si WebFlux est configuré dans Spring Boot.
Je pensais que si je plaçais la ressource dans classpath: / static /
et y accédais avec un navigateur WEB, une réponse serait renvoyée par le serveur, mais 404 Not Found est renvoyé.
Je me suis demandé si j'avais fait une erreur et parcouru la documentation de Spring Boot, mais [elle dit que cela peut être fait](https://docs.spring.io/spring-boot/docs/2.3.4.RELEASE/reference / htmlsingle / # boot-features-webflux-auto-configuration).
Les ressources statiques qui, selon la documentation, ne sont pas distribuées ne le sont pas. Je n'ai pas compris la raison, j'ai donc vérifié la configuration automatique de Spring Boot liée à WebFlux.
Recherchez une configuration pour la distribution de ressources statiques avec WebFlux WebFlux Auto Configurationを発見した。
Il semble que le mappage de ressources statiques soit ajouté avec WebFluxConfig # addResourceHandlers (ResourceHandlerRegistry)
, donc
Ajoutez des points d'arrêt à deux endroits, le constructeur WebFluxConfig # addResourceHandlers (ResourceHandlerRegistry)
et WebFlux
.
Attachez le débogueur et lancez l'application.
Cependant, le point d'arrêt n'a pas atteint lorsque l'application a fini de se lancer.
Lorsque la configuration automatique de Spring Boot n'est pas appelée, cela est généralement dû à un manque de @ Bean
ou à un manque de bibliothèques qui ne remplissent pas les conditions pour que la configuration automatique soit exécutée.
Quand je regardais à nouveau la documentation de Spring Boot, pensant que j'avais oublié quelque chose, J'ai remarqué que le document énonce clairement la cause.
Spring Boot implémente la configuration WebFlux avec WebFluxAutoConfiguration
.
Cette classe est donnée @ConditionalOnMissingBean ({WebFluxConfigurationSupport.class})
, donc
Si une autre implémentation WebFluxConfigurationSupport
est enregistrée avec @ Bean
, cette auto-configuration ne sera pas exécutée.
Vérifiez la définition de @ EnableWebFlux(https://github.com/spring-projects/spring-framework/blob/69921b49a5836e412ffcd1ea2c7e20d41f0c0fd6/spring-webflux/srcwork/main/java/org/springfigwork/webconrame/ /EnableWebFlux.java#L90)
@Import (DelegatingWebFluxConfiguration.class)est donné. Puisque
DelegatingWebFluxConfiguration est une implémentation de
WebFluxConfigurationSupport, Le
WebFluxAutoConfiguration fourni par Spring Boot ne fonctionnera pas comme une configuration automatique en raison du
ConditionalOnMissingBean`.
Depuis que j'ai ajouté @ EnableWebFlux
à la classe @ Configuration
dans le document Spring WebFlux, j'ai lu en premier.
J'étais convaincu que je devais l'accorder pour implémenter l'application WebFlux.
Cependant, Spring Boot fournit son propre WebFluxConfigurationSupport
pour ajouter des fonctionnalités à WebFlux, donc
Il y avait une règle selon laquelle @ EnableWebFlux
ne devait pas être ajouté lors de l'activation de WebFlux dans Spring Boot.
Les spécifications ici ont été fermement [écrites] dans la documentation de Spring Boot (https://docs.spring.io/spring-boot/docs/2.3.4.RELEASE/reference/htmlsingle/#boot-features- webflux-auto-configuration), mais Je l'ai sauté car c'était après avoir lu la documentation Spring WebFlux.
Spring Boot détecte la bibliothèque de chemin de classe et décide de configurer Spring MVC ou Spring WebFlux en tant que serveur WEB.
Maintenant, lorsque les bibliothèques Spring MVC et Spring WebFlux se trouvent dans le chemin de classe,
Comment puis-je contrôler le serveur WEB pour l'activer?
Je l'ai vérifié au cas où et spécifié REACTIVE
dans la propriété spring.main.web-application-type
de Spring Boot.
Il semble que vous puissiez configurer votre application avec WebFlux.
Le jugement du statut de réglage de spring.main.web-application-type
est
Cela se fait avec l'annotation @ConditionalOnWebApplication (type = ConditionalOnWebApplication.Type.REACTIVE)
donnée à WebFluxAutoConfiguration
.
Si vous souhaitez utiliser Spring MVC, spécifiez SERVLET
dans spring.main.web-application-type
.
Recommended Posts