web-dev-qa-db-fra.com

Comment diffuser du contenu statique à l'aide de Webflux?

J'apprends webflux et je voudrais savoir comment diffuser du contenu statique sur un MicroService en utilisant webflux mais je n'ai pas trouvé d'informations pour le faire.

19
jabrena

Essaye ça

RouterFunction router = resources("/**", new ClassPathResource("public/"));

PDATE: N'oubliez pas de spécifier un nom du fichier statique dans l'URL lorsque vous y accédez de l'extérieur, comme localhost:8080/index.html

14
Juan Medina

Juan Medina a raison. Je veux juste le rendre encore plus clair et fournir un lien de référence .

En fait, il vous suffit d'ajouter un bean RouterFunction pour gérer les ressources statiques. Vous n'avez pas à implémenter votre propre RouterFunction car RouterFunctions.resources("/**", new ClassPathResource("static/")); donne ce que vous voulez.

Tout ce que je fais, c'est d'ajouter ce morceau de code:

@Bean
RouterFunction<ServerResponse> staticResourceRouter(){
    return RouterFunctions.resources("/**", new ClassPathResource("static/"));
}

Quelles que soient les requêtes non reconnues, elles tomberont dans le routeur statique.

10

Configuration de Spring Web Flux et des ressources Web statiques publiques

  • mettre des ressources Web statiques publiques dans le public-web-resources dossier:

    ./src/main/public-web-resources
    
  • configurer Spring Boot 2.0 , application.yaml :

    spring.main.web-application-type: "REACTIVE"
    spring.webflux.static-path-pattern: "/app/**"
    spring.resources.static-locations:
      - "classpath:/public-web-resources/"
    
  • configurer maven-resources-plugin , pom.xml :

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/public-web-resources</directory>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                            <outputDirectory>${basedir}/target/classes/public-web-resources</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.0.BUILD-SNAPSHOT</version>
            </plugin>
        </plugins>
    </build>
    
6
wildloop

Merci wildloop a fonctionné pour moi avec les propriétés suivantes:

spring.webflux.static-path-pattern: "/**"
spring.resources.static-locations: "classpath:/public-web-resources/"

Spring Boot ajoute la ligne de journal suivante:

15:51:43.776 INFO  Adding welcome page: class path resource [public-web-resources/index.html] - WebMvcAutoConfiguration$WelcomePageHandlerMapping.<init> 

Et cela fonctionne comme une page d'accueil pour http: // localhost: port/myapp /

Je souhaite qu'il y ait un moyen de l'invoquer sur /myapp/docs

2
No_One

J'ai eu du mal à héberger du contenu statique en dehors du .jar exécutable. Avec Spring Boot MVC, vous pouvez simplement créer un répertoire public à côté du .jar et il servira les fichiers pour vous. Avec Spring Webflux, ce n'est pas le cas. Les solutions mentionnées ici ne fonctionnent que si vous placez les fichiers statiques dans le resources/public dossier, puis créez le .jar.

J'ai eu webflux de printemps pour servir du contenu statique sans l'inclure dans le pot avec la configuration suivante:

spring:
  application:
    name: spring-cloud-gateway
  webflux.static-path-pattern: "/**"
  resources.static-locations: "file:public/"

Avec cela, vous pouvez créer le webflux jar et ajouter les fichiers statiques plus tard lors du déploiement.

0
Luke Kroon