Static Content in Spring WebFlux

1. Overview

Sometimes, we have to serve static content in our web applications. It might be an image, HTML, CSS, or a JavaScript file.

In this tutorial, we’ll show how to serve static content using Spring WebFlux. We also assume that our web application will be configured using Spring Boot.

2. Overriding the Default Configuration

By default, Spring Boot serves static content from the following locations:

  • /public
  • /static
  • /resources
  • /META-INF/resources

All files from these paths are served under the /[resource-file-name] path.

If we want to change the default path for Spring WebFlux, we need to add this property to our application.properties file:

spring.webflux.static-path-pattern=/assets/**

Now, the static resources will be located under /assets/[resource-file-name].

Please note that this won’t work when the @EnableWebFlux annotation is present.

3. Routing Example

It’s also possible to serve static content using the WebFlux routing mechanism.

Let’s look at an example of a routing definition to serve the index.html file:

@Bean
public RouterFunction<ServerResponse> htmlRouter(
  @Value("classpath:/public/index.html") Resource html) {
    return route(GET("/"), request
      -> ok().contentType(MediaType.TEXT_HTML).syncBody(html)
    );
}

We can also serve static content from custom locations with the help of RouterFunction.

Let’s see how to serve images from the src/main/resources/img directory using the /img/** path:

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

4. Custom Web Resources Path Example

Another way to serve static assets stored in custom locations, instead of the default src/main/resources path, is to use the maven-resources-plugin and an additional Spring WebFlux property.

First, let’s add the plugin to our pom.xml:

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <resources>
                    <resource>
                        <directory>src/main/assets</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
                <outputDirectory>${basedir}/target/classes/assets</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Then, we simply need to set the static locations property:

spring.resources.static-locations=classpath:/assets/

After these actions, the index.html will be available under the http://localhost:8080/index.html URL.

5. Conclusion

In this article, we learned how to serve static content in Spring WebFlux.

As always, the sample code presented is available over on GitHub.

Related posts:

Java – Delete a File
Java Web Services – JAX-WS – SOAP
Guide To CompletableFuture
Hướng dẫn Java Design Pattern – Mediator
Tạo ứng dụng Java RESTful Client không sử dụng 3rd party libraries
Java Concurrency Interview Questions and Answers
Java Program to Generate All Pairs of Subsets Whose Union Make the Set
RegEx for matching Date Pattern in Java
Write/Read cookies using HTTP and Read a file from the internet
Java Program to Implement the Edmond’s Algorithm for Maximum Cardinality Matching
Cachable Static Assets with Spring MVC
Java Program to Implement Hash Tables with Linear Probing
Spring Boot - Cloud Configuration Client
The Spring @Controller and @RestController Annotations
Java Collections Interview Questions
Java Program to Find kth Largest Element in a Sequence
Java 8 Stream API Analogies in Kotlin
Tổng quan về ngôn ngữ lập trình java
Convert Character Array to String in Java
Java Program to Perform Inorder Non-Recursive Traversal of a Given Binary Tree
Java Program to Implement the Hill Cypher
Refactoring Design Pattern với tính năng mới trong Java 8
Serialize Only Fields that meet a Custom Criteria with Jackson
Number Formatting in Java
Hướng dẫn Java Design Pattern – Iterator
Batch Processing with Spring Cloud Data Flow
Spring MVC and the @ModelAttribute Annotation
Java Program to Implement Miller Rabin Primality Test Algorithm
Different Ways to Capture Java Heap Dumps
Introduction to Spring Boot CLI
Spring Data JPA @Query
Java Program to Construct a Random Graph by the Method of Random Edge Selection