In this previous example, we have seen how to use DTO in Spring boot application and we have written a code to manually convert Entity to DTO. In this example, we will see how to use ModelMapper library to automatically convert Entity to DTO and vice-versa.
Here are the simple steps to follow to use ModelMapper library in Spring boot application.
The source code of this tutorial available on our GitHub repository at https://github.com/RameshMF/springboot-dto-tutorial
YouTube Video
1. Add ModelMapper Dependency
Open pom.xml file and add the following ModelMapper dependency:
<!-- https://mvnrepository.com/artifact/org.modelmapper/modelmapper -->
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.4</version>
</dependency>
<?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 https://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.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.javaguides</groupId>
<artifactId>springboot-dto-tutorial</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-dto-tutorial</name>
<description>Demo project for Spring Boot and DTO</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.modelmapper/modelmapper -->
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. Configure ModelMapper as Spring Bean
Open Spring boot main application class and add the following ModelMapper bean configuration:
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
Here is the complete code:
package net.javaguides.springboot;
import net.javaguides.springboot.model.Location;
import net.javaguides.springboot.model.User;
import net.javaguides.springboot.repository.LocationRepository;
import net.javaguides.springboot.repository.UserRepository;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringbootDtoTutorialApplication implements CommandLineRunner {
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
public static void main(String[] args) {
SpringApplication.run(SpringbootDtoTutorialApplication.class, args);
}
@Autowired
private UserRepository userRepository;
@Autowired
private LocationRepository locationRepository;
@Override
public void run(String... args) throws Exception {
Location location = new Location();
location.setPlace("Pune");
location.setDescription("Pune is great place to live");
location.setLongitude(40.5);
location.setLatitude(30.6);
locationRepository.save(location);
User user1 = new User();
user1.setFirstName("Ramesh");
user1.setLastName("Fadatare");
user1.setEmail("ramesh@gmail.com");
user1.setPassword("secret");
user1.setLocation(location);
userRepository.save(user1);
User user2 = new User();
user2.setFirstName("John");
user2.setLastName("Cena");
user2.setEmail("john@gmail.com");
user2.setPassword("secret");
user2.setLocation(location);
userRepository.save(user2);
}
}
3. Inject or Autowire ModelMapper Bean in Service Class
@Autowired
private UserRepository userRepository;
Here is the complete code:
package net.javaguides.springboot.service;
import net.javaguides.springboot.dto.UserLocationDTO;
import net.javaguides.springboot.model.User;
import net.javaguides.springboot.repository.UserRepository;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private ModelMapper modelMapper;
// ....
}
4. Convert Entity to DTO and Vice-Versa using ModelMapper
private UserLocationDTO convertEntityToDto(User user){
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE);
UserLocationDTO userLocationDTO = new UserLocationDTO();
userLocationDTO = modelMapper.map(user, UserLocationDTO.class);
return userLocationDTO;
}
private User convertDtoToEntity(UserLocationDTO userLocationDTO){
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE);
User user = new User();
user = modelMapper.map(userLocationDTO, User.class);
return user;
}
Here is the complete code:
private UserLocationDTO convertEntityToDto(User user){
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE);
UserLocationDTO userLocationDTO = new UserLocationDTO();
userLocationDTO = modelMapper.map(user, UserLocationDTO.class);
return userLocationDTO;
}
private User convertDtoToEntity(UserLocationDTO userLocationDTO){
modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.LOOSE);
User user = new User();
user = modelMapper.map(userLocationDTO, User.class);
return user;
}
Run and Test Spring boot application
Just go to the root directory of the application and type the following command to run it -
$ mvn spring-boot:run
The application will start at Spring Boot’s default tomcat port 8080.
Hit below URL in browser to get response of the REST API:
http://localhost:8080/users-location