Spring MVC Tutorial
Core Spring MVC
Spring MVC - Annotation
Spring MVC - Form Handling
Spring MVC with JSTL
Spring MVC with REST API
Spring MVC with Database
A Data Transfer Object (DTO) is an object that carries data between processes. When working with a layered architecture, you'll often find the need for DTOs to transfer data between your layers, especially when the internal data representation (like domain models) differs from the external representation exposed to the user (like API responses).
In Spring MVC, DTOs are commonly used in combination with entities to expose specific data through APIs or to aggregate data from multiple sources.
Imagine a User
entity and a corresponding UserDTO
.
This represents the data model often mapped to a database table using an ORM like JPA.
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // this should be encrypted in real applications private String email; // getters, setters, etc. }
For the sake of the example, let's say you want to expose user data through an API, but you don't want to expose the password.
public class UserDTO { private Long id; private String username; private String email; // getters, setters, etc. }
A common task is converting entities to DTOs and vice-versa. You might do this in a service layer or with the help of tools like ModelMapper or MapStruct.
For simplicity, here's a manual conversion in a service method:
@Service public class UserService { @Autowired private UserRepository userRepository; public UserDTO getUserById(Long id) { Optional<User> user = userRepository.findById(id); if (user.isPresent()) { return toDTO(user.get()); } return null; // or throw an exception } private UserDTO toDTO(User user) { UserDTO dto = new UserDTO(); dto.setId(user.getId()); dto.setUsername(user.getUsername()); dto.setEmail(user.getEmail()); return dto; } }
Now, with the UserDTO
ready, you can expose user data without exposing sensitive information like passwords.
@RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ResponseEntity<UserDTO> getUser(@PathVariable Long id) { UserDTO userDTO = userService.getUserById(id); if (userDTO != null) { return ResponseEntity.ok(userDTO); } return ResponseEntity.notFound().build(); } }
In this example, when a GET request is made to /api/users/{id}
, it returns user data without the password.
Using DTOs in Spring MVC is a common pattern, especially in applications with a layered architecture. It allows for a clean separation between internal data representation (entities) and external data representation (APIs, forms). It also provides flexibility in determining which data to expose and which to keep private.
Example of using Data Transfer Objects in Spring MVC:
UserEntity
representing a user in your database. Create a UserDTO
to transfer user data between the client and server:// UserEntity.java @Entity public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; // other fields, getters, setters }
// UserDTO.java public class UserDTO { private String username; private String email; // getters, setters }
// UserController.java @RestController @RequestMapping("/users") public class UserController { @PostMapping("/create") public ResponseEntity<String> createUser(@RequestBody UserDTO userDTO) { // Validate and process userDTO, then save to the database return ResponseEntity.ok("User created successfully"); } }
In this example, the UserDTO
is used to transfer user data during the creation of a new user.