Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Spring WebFlux with Spring Boot Tutorial

Introduction

Spring WebFlux is a reactive programming framework designed to handle asynchronous data streams in Java. It is part of the Spring Framework 5 and provides an alternative to the traditional Spring MVC. In this tutorial, we will explore how to set up a Spring Boot application using Spring WebFlux, create RESTful web services, and understand the core concepts of reactive programming.

Prerequisites

Before we begin, ensure you have the following installed:

  • Java Development Kit (JDK) 8 or higher
  • Apache Maven
  • An IDE such as IntelliJ IDEA or Eclipse

Creating a Spring Boot Project

To create a Spring Boot project with WebFlux, you can use the Spring Initializr. Follow these steps:

  1. Go to Spring Initializr.
  2. Select the following options:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 2.5.0 or higher
    • Packaging: Jar
    • Java: 11 or 8
  3. Add Dependencies:
    • Spring Reactive Web
    • Spring Data R2DBC (optional for reactive database)
  4. Click on "Generate" to download the project.
  5. Extract the downloaded zip file and open it in your IDE.

Setting Up Reactive Controller

Now, let's create a simple reactive REST controller. First, create a package named controller in the src/main/java/com/example/demo directory. Inside this package, create a class named GreetingController.

GreetingController.java

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class GreetingController {

    @GetMapping("/greet")
    public Mono<String> greet() {
        return Mono.just("Hello, World!");
    }
}

In this example, we define a simple REST endpoint /greet that returns a greeting message. The return type is Mono<String>, which represents a single asynchronous value.

Running the Application

To run the application, open a terminal and navigate to the root directory of your project. Use the following command:

./mvnw spring-boot:run

Once the application starts, open your browser and navigate to http://localhost:8080/greet. You should see the message Hello, World!.

Understanding Reactive Programming Concepts

Reactive programming is based on the observer pattern, where components react to changes or events. In Spring WebFlux, there are two main types of publishers:

  • Mono: Represents a single asynchronous value or an empty result.
  • Flux: Represents a sequence of asynchronous values (0 to N).

These publishers can be used to build non-blocking applications that can handle many concurrent requests efficiently.

Creating Reactive Data Access

For data access, we can use Spring Data R2DBC to interact with a reactive database. First, add the following dependency to your pom.xml file:

Add Dependency for R2DBC

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
    <groupId>io.r2dbc</groupId>
    <artifactId>r2dbc-h2</artifactId>
</dependency>

Next, create a model class and a repository interface. Create a package named model and add the following class:

Greeting.java

package com.example.demo.model;

import org.springframework.data.annotation.Id;

public class Greeting {

    @Id
    private Long id;
    private String message;

    // Getters and setters
}

Now, create a repository interface in a new package named repository:

GreetingRepository.java

package com.example.demo.repository;

import com.example.demo.model.Greeting;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;

public interface GreetingRepository extends ReactiveCrudRepository<Greeting, Long> {
}

Using the Repository in Controller

Now, let's modify the GreetingController to use the repository. Inject the repository into the controller and create an endpoint to save a greeting:

Updated GreetingController.java

package com.example.demo.controller;

import com.example.demo.model.Greeting;
import com.example.demo.repository.GreetingRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/greetings")
public class GreetingController {

    @Autowired
    private GreetingRepository greetingRepository;

    @GetMapping
    public Flux<Greeting> getAllGreetings() {
        return greetingRepository.findAll();
    }

    @PostMapping
    public Mono<Greeting> createGreeting(@RequestBody Greeting greeting) {
        return greetingRepository.save(greeting);
    }
}

Now you can access all greetings at /greetings and create a new greeting by sending a POST request with a JSON body.

Conclusion

In this tutorial, we have covered the basics of Spring WebFlux with Spring Boot, including setting up a project, creating a reactive controller, understanding reactive programming concepts, and performing data access with R2DBC. Spring WebFlux provides a powerful way to build scalable and non-blocking applications. Explore further by integrating with different databases and using more advanced reactive features.