Spring @RequestBody - Binding Method Parameters to Request Body

In this article, we will learn how to use Spring @RequestBody annotation to bind method parameters to request body. We create a Spring Boot RESTful application to demonstrate the annotation.

Video - Subscribe to Java Guides Channel


This article explained in my youtube video at:

Spring @RequestBody

@RequestBody annotation binds request body to method parameters. The process of serialization/deserialization is performed by HttpMessageConverter. In addition, automatic validation can be applied by annotating the argument with @Valid.
Here is a sample code snippet:
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value="/users")
public void method(@RequestBody MultiValueMap<String, String> values) {
 logger.info("Values:{}", values);
}

@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value="/users", consumes = MediaType.APPLICATION_JSON_VALUE)
public void method1(@RequestBody User user) {
 logger.info("User: {}", user);
}

Spring Boot @RequestBody Annotation Example

The following example creates a Spring Boot web application which binds method parameters to the request body.

Development Steps

  1. Create a Spring Boot Application
  2. Project Structure
  3. Pom Dependencies
  4. Java Bean - User.java
  5. Create REST Controller - UserController.java
  6. Run Application - Application.java
  7. Testing from Postman Rest Client

1. Create a Spring Boot Application

There are many ways to create a Spring Boot application. You can refer below articles to create a Spring Boot application.
Refer project structure or packaging structure in the next step.

2. Project Structure

This is the project structure of the Spring Boot application that we are going to create - 

3. Pom Dependencies

This is the Maven build file. The spring-boot-starter-web is a starter for building web applications using Spring MVC. It uses Tomcat as the default embedded container.
<?xml version="1.0" encoding="UTF-8"?>
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath />
        <!-- lookup parent from repository -->
    </parent>
    <groupId>net.javaguides.springboot</groupId>
    <artifactId>springboot-annotations-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-annotations-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4. Java Bean - User.java

Let's create a representation class which we use to bind to method parameters to request body:
package net.javaguides.springboot;

public class User {

    private Integer id;
    private String name;

    public User() {}

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5. Create REST Controller - UserController.java

Let's create a simple UserController to handle HTTP POST methods. In UserController, we have two POST mappings. We use @RequestBody to bind request parameters to MultiValueMap and User bean. The bound values are shown in logs.
package net.javaguides.springboot;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @ResponseStatus(value = HttpStatus.OK)
    @PostMapping(value = "/users")
    public void method(@RequestBody MultiValueMap < String, String > values) {
        logger.info("Values:{}", values);
    }

    @ResponseStatus(value = HttpStatus.OK)
    @PostMapping(value = "/users", consumes = MediaType.APPLICATION_JSON_VALUE)
    public void method1(@RequestBody User user) {
        logger.info("User: {}", user);
    }
}

6. Run Application - Application.java

Application is the entry point which sets up the Spring Boot application. The @SpringBootApplication annotation enables auto-configuration and component scanning.
Let's run this Spring boot application from either Eclipse IDE by right click -> Run As -> Java Application.
Or you can use below maven command to run:
mvn spring-boot:run

7. Testing from Postman Rest Client

Testing @RequestBody to bind request parameters to User:

Testing @RequestBody to bind request parameters to MultiValueMap:

Comments