[JAVA] Les ressources statiques ne pouvaient pas être distribuées à partir de WebFlux lorsque @EnableWebFlux était accordé dans Spring Boot

Conclusion

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.

Résumé

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.

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é. PuisqueDelegatingWebFluxConfiguration 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.

De côté

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

Les ressources statiques ne pouvaient pas être distribuées à partir de WebFlux lorsque @EnableWebFlux était accordé dans Spring Boot
Spécifiez le codage des ressources statiques dans Spring Boot
JSESSIONID n'a pas pu être attribué à l'URL lors de l'utilisation de Spring Security
Priorité d'accès aux fichiers statiques dans Spring Boot
L'histoire de la transition de Spring Boot 1.5 à 2.1
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Lorsque @Transactional of Spring Boot ne fonctionne pas
Personnalisez l'affichage lorsqu'une erreur telle que 404 Not Found se produit dans Spring Boot