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:

How to Manually Authenticate User with Spring Security
Java Program to Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Spring – Injecting Collections
Java – Write an InputStream to a File
Java Program to Implement ConcurrentSkipListMap API
Working with Kotlin and JPA
Java Program to Implement SynchronosQueue API
Java Program to implement Bit Set
Java Program to Construct K-D Tree for 2 Dimensional Data
How to Add a Single Element to a Stream
Prevent Cross-Site Scripting (XSS) in a Spring Application
How to Get All Dates Between Two Dates?
Java Program to Implement First Fit Decreasing for 1-D Objects and M Bins
How to Use if/else Logic in Java 8 Streams
Java Program to Solve Set Cover Problem assuming at max 2 Elements in a Subset
Guava – Join and Split Collections
A Guide to LinkedHashMap in Java
Java Program to Solve Knapsack Problem Using Dynamic Programming
Java Program to Implement Insertion Sort
Java Scanner hasNext() vs. hasNextLine()
Serialization và Deserialization trong java
Spring Boot Security Auto-Configuration
String Operations with Java Streams
Java Program to Compute Discrete Fourier Transform Using the Fast Fourier Transform Approach
Debug a JavaMail Program
Java Program to Implement Levenshtein Distance Computing Algorithm
Configure a Spring Boot Web Application
Inject Parameters into JUnit Jupiter Unit Tests
Java Program to Implement Ternary Tree
Sorting Query Results with Spring Data
Java Program to Implement Hash Tables with Quadratic Probing
A Guide to the finalize Method in Java