Entity To DTO Conversion for Spring REST API

grayscale photo of computer laptop near white notebook and ceramic mug on table
Reading Time: 4 minutes


In most enterprise architecture, you will have REST APIs. A consumer of these APIs sends a request and the server responds with a response. The transformation of request to response happens behind the API. You perform business logic and modify these objects.

Traditionally, there are three layers in the architecture. Web layer, business layer, and database layer.

So, your object in the database layer will be completely different from the same object in the web layer. Database entities from the database layer contain certain fields that you don’t need in the web layer.

In this blog, we’ll handle the conversions that need to happen between the internal entities of a Spring application and the external DTOs(Data Transfer Objects) that are published back to the client.

Model Mapper

The main role of ModelMapper is to map objects by determining how one object model mapped to another called a Data Transformation Object (DTO).

Let’s start by introducing the main library that we’re going to use to perform this entity-DTO conversion,  ModelMapper.

We will need this dependency in the pom.xml:


Then we’ll define the ModelMapper bean in our Spring configuration:

public ModelMapper modelMapper() {
    return new ModelMapper();


DTO stands for Data Transfer Object, which is a design pattern. It is one of the EPA patterns which we call when we need to use such objects that encapsulate and aggregate data for transfer. A DTO is similar to a data structure, but like a data structure, it doesn’t contain any business logic. It contains mechanisms of serialization and de-serialization. In DTO, we can store data from a single source or from multiple resources. We can either store complete data or can store a small amount of data from a source.

If we implemented DTOs in the code, it means that data transportation is done between the systems. The DTO is mainly used for reducing the number of expensive remote calls.

Next let’s introduce the DTO side of this two-sided problem, Post DTO:

public class PostDto {
    private static final SimpleDateFormat dateFormat
      = new SimpleDateFormat("yyyy-MM-dd HH:mm");

    private Long id;

    private String title;

    private String url;

    private String date;

    private UserDto user;

    public Date getSubmissionDateConverted(String timezone) throws ParseException {
        return dateFormat.parse(this.date);

    public void setSubmissionDate(Date date, String timezone) {
        this.date = dateFormat.format(date);

    // standard getters and setters

Note that the two custom date related methods handle the date conversion back and forth between the client and the server:

  • getSubmissionDateConverted() method converts date String into a Date in the server’s timezone to use it in the persisting Post entity
  • setSubmissionDate() method is to set DTO’s date to Post‘s Date in current user timezone

The Service Layer

Now let’s look at a service level operation, which will obviously work with the Entity (not the DTO):

public List<Post> getPostsList(
  int page, int size, String sortDir, String sort) {
    PageRequest pageReq
     = PageRequest.of(page, size, Sort.Direction.fromString(sortDir), sort);
    Page<Post> posts = postRepository
      .findByUser(userService.getCurrentUser(), pageReq);
    return posts.getContent();

We’re going to have a look at the layer above service next, the controller layer. This is where the conversion will actually happen.

The Controller Layer 

Next let’s examine a standard controller implementation, exposing the simple REST API for the Post resource.

We’re going to show here a few simple CRUD operations: create, update, get one, and get all. The operations are pretty straightforward.

class PostRestController {

    private IPostService postService;

    private IUserService userService;

    private ModelMapper modelMapper;

    public List<PostDto> getPosts(...) {
        List<Post> posts = postService.getPostsList(page, size, sortDir, sort);
        return posts.stream()

    public PostDto createPost(@RequestBody PostDto postDto) {
        Post post = convertToEntity(postDto);
        Post postCreated = postService.createPost(post));
        return convertToDto(postCreated);

    @GetMapping(value = "/{id}")
    public PostDto getPost(@PathVariable("id") Long id) {
        return convertToDto(postService.getPostById(id));

    @PutMapping(value = "/{id}")
    public void updatePost(@PathVariable("id") Long id, @RequestBody PostDto     
    postDto) {
        if(!Objects.equals(id, postDto.getId())){
            throw new IllegalArgumentException("IDs don't match");
        Post post = convertToEntity(postDto);

Here is our conversion from Post entity to PostDto:

private PostDto convertToDto(Post post) {
    PostDto postDto = modelMapper.map(post, PostDto.class);
    return postDto;

Here is the conversion from DTO to an entity:

private Post convertToEntity(PostDto postDto) throws ParseException {
    Post post = modelMapper.map(postDto, Post.class);
    if (postDto.getId() != null) {
        Post oldPost = postService.getPostById(postDto.getId());
    return post;

So as we can see, with the help of the model mapper, the conversion logic is quick and simple.  We are using the map API of the mapper, and getting the data converted without writing a single line of conversion logic.

Unit Testing

Finally, let’s do a very simple test to make sure the conversions between the entity and the DTO work well:

public class PostDtoUnitTest {

    private ModelMapper modelMapper = new ModelMapper();

    public void whenConvertPostEntityToPostDto_thenCorrect() {
        Post post = new Post();

        PostDto postDto = modelMapper.map(post, PostDto.class);
        assertEquals(post.getId(), postDto.getId());
        assertEquals(post.getTitle(), postDto.getTitle());
        assertEquals(post.getUrl(), postDto.getUrl());

    public void whenConvertPostDtoToPostEntity_thenCorrect() {
        PostDto postDto = new PostDto();

        Post post = modelMapper.map(postDto, Post.class);
        assertEquals(postDto.getId(), post.getId());
        assertEquals(postDto.getTitle(), post.getTitle());
        assertEquals(postDto.getUrl(), post.getUrl());


In this blog, we detailed simplifying the conversion from Entity to DTO, and from DTO to Entity in a Spring REST API, by using the model mapper library instead of writing these conversions by hand.

Reference Link :- https://en.wikipedia.org/wiki/Data_transfer_object .

Written by 

KRISHNA JAISWAL is Software Consultant Trainee at Knoldus. He is passionate about JAVA , MYSQL , having knowledge of C , C++ and much more. He is recognised as a good team player, a dedicated and responsible professional, and a technology enthusiast. He is a quick learner & curious to learn new technologies. His hobbies include reading Books , listening Music and playing Cricket .