DEV Community

Anh Trần Tuấn
Anh Trần Tuấn

Posted on • Originally published at tuanh.net on

Techniques to Apply JSON Patch to JPA Entities in Spring Boot: A Comprehensive Guide

1. What is JSON Patch, and Why Use It?

JSON Patch is a standard format (RFC 6902) for describing changes to a JSON document. It represents a series of operations that can be applied to modify a JSON object. These operations include add, remove, replace, copy, move, and test.

Image

In the context of Spring Boot and JPA entities, JSON Patch can be useful when you need to make partial updates without sending the full entity object. This can save bandwidth and processing time, especially in microservices architectures, where efficiency is key.

1.1 Advantages of Using JSON Patch

  • Reduced Payload Size : Instead of sending the entire object, you only send the fields that need to be updated.
  • Improved Performance : Only modified parts of the entity are updated, which reduces the load on the database.
  • Fine-Grained Control : You can perform complex operations like removing or moving fields in a structured way.

1.2 JSON Patch Structure

A JSON Patch request contains an array of operations. Each operation is defined with three fields:

  • op : The operation type (add, remove, replace, etc.).
  • path : The location of the field to operate on (e.g., /name).
  • value : The new value to apply (for operations like add or replace).

Here's an example of a JSON Patch payload that updates a user’s name and adds a new email:

[
  { "op": "replace", "path": "/name", "value": "John Doe" },
  { "op": "add", "path": "/email", "value": "john.doe@example.com" }
]
Enter fullscreen mode Exit fullscreen mode

2. Applying JSON Patch to JPA Entities in Spring Boot

Now, let’s look at how to integrate JSON Patch in a Spring Boot application with JPA entities. We will walk through setting up the necessary dependencies, creating a controller, and handling the patch request in a meaningful way.

2.1 Setting Up Dependencies

To work with JSON Patch in Spring Boot, you need to include the spring-boot-starter-web dependency and the jackson-databind library in your pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
Enter fullscreen mode Exit fullscreen mode

Additionally, you'll need the jackson-databind-json-patch package for JSON Patch support:

<dependency>
    <groupId>com.github.fge</groupId>
    <artifactId>json-patch</artifactId>
    <version>1.13</version>
</dependency>
Enter fullscreen mode Exit fullscreen mode

2.2 Creating a JPA Entity

Let’s assume we are working with a simple User entity. Below is an example of the JPA entity class:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
}
Enter fullscreen mode Exit fullscreen mode

2.3 Creating the JSON Patch Handler

To handle a JSON Patch request in Spring Boot, we need a service that applies the patch to the JPA entity. Let’s create a UserService class:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private ObjectMapper objectMapper;

    public User applyPatchToUser(JsonPatch patch, Long userId) throws JsonPatchException, JsonProcessingException {
        User user = userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found"));
        User patchedUser = applyPatch(patch, user);
        return userRepository.save(patchedUser);
    }

    private User applyPatch(JsonPatch patch, User targetUser) throws JsonPatchException, JsonProcessingException {
        JsonNode patched = patch.apply(objectMapper.convertValue(targetUser, JsonNode.class));
        return objectMapper.treeToValue(patched, User.class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Here, we:

  • Retrieve the User entity by userId.
  • Apply the JSON Patch to the retrieved entity.
  • Convert the patched JSON object back to the User class using Jackson’s ObjectMapper.

2.4 Implementing the Controller

Now that we have our service ready, let's create a controller to accept JSON Patch requests:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PatchMapping(value = "/{id}", consumes = "application/json-patch+json")
    public ResponseEntity<User> patchUser(@PathVariable Long id, @RequestBody JsonPatch patch) {
        try {
            User updatedUser = userService.applyPatchToUser(patch, id);
            return ResponseEntity.ok(updatedUser);
        } catch (JsonPatchException | JsonProcessingException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

This controller defines a PATCH endpoint that consumes application/json-patch+json. When a patch request is received, it calls the UserService to apply the patch to the entity and returns the updated entity.

3. Running a Demo

Let’s run the application and test our implementation.

Start the Spring Boot application.

Use Postman to send a PATCH request to update a user:

PATCH /users/1 HTTP/1.1
Content-Type: application/json-patch+json

[
  { "op": "replace", "path": "/name", "value": "Jane Doe" },
  { "op": "add", "path": "/email", "value": "jane.doe@example.com" }
]
Enter fullscreen mode Exit fullscreen mode

If everything is set up correctly, you should receive a 200 OK response with the updated user object:

{
  "id": 1,
  "name": "Jane Doe",
  "email": "jane.doe@example.com"
}
Enter fullscreen mode Exit fullscreen mode

4. Conclusion

Using JSON Patch to update JPA entities in Spring Boot provides a flexible and efficient method for handling partial updates. By following the steps in this article, you can implement JSON Patch in your Spring Boot applications and handle entity updates more efficiently.

If you have any questions or need further clarification, feel free to leave a comment below, and I’ll be happy to assist!

Read posts more at : Techniques to Apply JSON Patch to JPA Entities in Spring Boot: A Comprehensive Guide

Top comments (0)