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:

A Guide to ConcurrentMap
Java Program to Perform Addition Operation Using Bitwise Operators
Java CyclicBarrier vs CountDownLatch
ArrayList trong java
Inheritance and Composition (Is-a vs Has-a relationship) in Java
Rate Limiting in Spring Cloud Netflix Zuul
Java Program to Implement Coppersmith Freivald’s Algorithm
Practical Java Examples of the Big O Notation
Lớp Collectors trong Java 8
SOAP Web service: Authentication trong JAX-WS
Java Program to Find the Median of two Sorted Arrays using Binary Search Approach
Spring RequestMapping
Introduction to Spring MVC HandlerInterceptor
Java Program to Check if any Graph is Possible to be Constructed for a Given Degree Sequence
Lập trình hướng đối tượng (OOPs) trong java
Spring NoSuchBeanDefinitionException
Java Program to Generate Random Numbers Using Middle Square Method
Java – Convert File to InputStream
Java Program to Implement TreeMap API
Dockerizing a Spring Boot Application
Java Program to find the number of occurrences of a given number using Binary Search approach
The Spring @Controller and @RestController Annotations
Java Program to Solve Travelling Salesman Problem for Unweighted Graph
Java Program to Implement JobStateReasons API
Logout in an OAuth Secured Application
A Guide to the ResourceBundle
Checking for Empty or Blank Strings in Java
Request Method Not Supported (405) in Spring
An Example of Load Balancing with Zuul and Eureka
Giới thiệu Design Patterns
Spring Boot - Cloud Configuration Client
Custom Thread Pools In Java 8 Parallel Streams