Partner – Orkes – NPI EA (cat=Spring)
announcement - icon

Modern software architecture is often broken. Slow deliveryleads to missed opportunities, innovation is stalled due toarchitectural complexities, and engineering resources areexceedingly expensive.

Orkes is the leading workflow orchestration platformbuilt to enable teams to transform the way they develop, connect,and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers canfocus on building mission critical applications without worryingabout infrastructure maintenance to meet goals and, simply put,taking new products live faster and reducing total cost ofownership.

Try a14-Day FreeTrial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag=Microservices)
announcement - icon

Modern software architecture is often broken. Slow deliveryleads to missed opportunities, innovation is stalled due toarchitectural complexities, and engineering resources areexceedingly expensive.

Orkes is the leading workflow orchestration platformbuilt to enable teams to transform the way they develop, connect,and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers canfocus on building mission critical applications without worryingabout infrastructure maintenance to meet goals and, simply put,taking new products live faster and reducing total cost ofownership.

Try a14-DayFree Trial of Orkes Conductor today.

eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with SpringCloud:

>> Join Pro and download theeBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockitolibrary makes it easy to writeclean and intuitive unittests for your Java code.

Get started with mocking and improve your application testsusing ourMockito guide:

Download theeBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky processwith manypotential pitfalls. A solid grasp of thefundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications withourJava Concurrency guide:

>>Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the SpringWebFlux module, which has been improved upon ever since. Getstarted with the Reactor project basics andreactive programmingin Spring Boot:

>> Join Pro anddownload the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become astaple of Java development. The basic operations like iterating,filtering, mapping sequences of elements are deceptively simple touse.

But these can also be overused and fall into some commonpitfalls.

Toget a better understanding on how Streams work and howto combine them with other language features, check out our guideto Java Streams:

>> Join Proand download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download theE-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download theE-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore theeBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through theLearnSpring course:

>> LEARNSPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building afullREST API with the framework:

>>The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advancedfunctionality within the Core to the deep OAuth support in theframework.

I built the security material astwo full courses - Core andOAuth, to get practical with these more complex scenarios. Weexplore when and how to use each feature andcode through it onthe backing project.

You can explore the course here:

>> Learn SpringSecurity

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle thecomplexity ofJPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided referencecourse:

>> CHECK OUT THECOURSE

Partner – LambdaTest – NPI EA (cat=Testing)
announcement - icon

Accessibility testing is a crucial aspect to ensure thatyour application is usable for everyone and meetsaccessibility standards that are required in many countries.

By automating these tests, teams canquickly detectissues related to screen reader compatibility, keyboardnavigation, color contrast, and other aspects that could pose abarrier to using the software effectively for people withdisabilities.

Learn how to automate accessibility testing with Selenium andtheLambdaTest cloud-based testing platform that letsdevelopers and testers perform accessibility automation on over3000+ real environments:

Automated Accessibility TestingWith Selenium

1. Overview

In this tutorial, we’ll discuss the DTO pattern, what it is, and how and when to use it. By the end, we’ll know how to use it properly.

Further reading:

Design Patterns in the Spring Framework

Learn about four of the most common design patterns used in the Spring Framework

Difference Between MVC and MVP Patterns

Learn about the differences between the MVC and MVP Patterns.

Clean Architecture with Spring Boot

In general, our functional requirements, frameworks, I/O devices, and even our code design may all change for various reasons. With this in mind, the Clean Architecture is a guideline to a high maintainable code, considering all the uncertainties around us.

2. The Pattern

DTOs or Data Transfer Objects are objects that carry data between processes in order to reduce the number of methods calls. The pattern was first introduced by Martin Fowler in his bookEAA.

Fowler explained that the pattern’s main purpose is to reduce roundtrips to the server by batching up multiple parameters in a single call. This reduces the network overhead in such remote operations.

Another benefit is the encapsulation of the serialization’s logic (the mechanism that translates the object structure and data to a specific format that can be stored and transferred). It provides a single point of change in the serialization nuances. It also decouples the domain models from the presentation layer, allowing both to change independently.

3. How to Use It?

DTOs normally are created asPOJOs. They are flat data structures that contain no business logic. They only contain storage, accessors and eventually methods related to serialization or parsing.

The data is mapped from thedomain models to the DTOs, normally through a mapper component in the presentation or facade layer.

The image below illustrates the interaction between the components:layers 4

4. When to Use It?

DTOs come in handy in systems with remote calls, as they help to reduce the number of them.

DTOs also help when the domain model is composed of many different objects and the presentation model needs all their data at once, or they can even reduce roundtrip between client and server.

With DTOs, we can build different views from our domain models, allowing us to create other representations of the same domain but optimizing them to the clients’ needs without affecting our domain design. Such flexibility is a powerful tool to solve complex problems.

5. Use Case

To demonstrate the implementation of the pattern, we’ll use a simple application with two main domain models, in this case,User andRole. To focus on the pattern, let’s look at two examples of functionality — user retrieval and the creation of new users.

5.1. DTO vs Domain

Below is the definition of both models:

public class User {    private String id;    private String name;    private String password;    private List<Role> roles;    public User(String name, String password, List<Role> roles) {        this.name = Objects.requireNonNull(name);        this.password = this.encrypt(password);        this.roles = Objects.requireNonNull(roles);    }    // Getters and Setters   String encrypt(String password) {       // encryption logic   }}
public class Role {    private String id;    private String name;    // Constructors, getters and setters}

Now let’s look at the DTOs so that we can compare them with the Domain models.

At this moment, it’s important to notice that the DTO represents the model sent from or to the API client.

Therefore, the small differences are either to pack together the request sent to the server or optimize the response of the client:

public class UserDTO {    private String name;    private List<String> roles;        // standard getters and setters}

The DTO above provides only the relevant information to the client, hiding the password, for example, for security reasons.

The next DTO groups all the data necessary to create a user and sends it to the server in a single request, which optimizes the interactions with the API:

public class UserCreationDTO {    private String name;    private String password;    private List<String> roles;    // standard getters and setters}

5.2. Connecting Both Sides

Next, the layer that ties both classes uses a mapper component to pass the data from one side to the other and vice versa.

This normally happens in the presentation layer:

@RestController@RequestMapping("/users")class UserController {    private UserService userService;    private RoleService roleService;    private Mapper mapper;    // Constructor    @GetMapping    @ResponseBody    public List<UserDTO> getUsers() {        return userService.getAll()          .stream()          .map(mapper::toDto)          .collect(toList());    }    @PostMapping    @ResponseBody    public UserIdDTO create(@RequestBody UserCreationDTO userDTO) {        User user = mapper.toUser(userDTO);        userDTO.getRoles()          .stream()          .map(role -> roleService.getOrCreate(role))          .forEach(user::addRole);        userService.save(user);        return new UserIdDTO(user.getId());    }}

Last, we have theMapper component that transfers the data, making sure that both DTO and domain model don’t need to know about each other:

@Componentclass Mapper {    public UserDTO toDto(User user) {        String name = user.getName();        List<String> roles = user          .getRoles()          .stream()          .map(Role::getName)          .collect(toList());        return new UserDTO(name, roles);    }    public User toUser(UserCreationDTO userDTO) {        return new User(userDTO.getName(), userDTO.getPassword(), new ArrayList<>());    }}

6. Common Mistakes

Although the DTO pattern is a simple design pattern, we can make a few mistakes in applications implementing this technique.

The first mistake is to create different DTOs for every occasion. That will increase the number of classes and mappers we need to maintain. Try to keep them concise and evaluate the trade-offs of adding one or reusing an existing one.

We also want to avoid trying to use a single class for many scenarios. This practice may lead to big contracts where many attributes are frequently not used.

Another common mistake is to add business logic to those classes, which should not happen. The purpose of the pattern is to optimize the data transfer and the structure of the contracts. Therefore, all business logic should live in the domain layer.

Last, we have the so-calledLocalDTOs, where DTOs pass data across domains. The problem once again is the cost of maintenance of all the mapping.

One of the most common arguments in favor of this approach is the encapsulation of the domain model. But the problem here is to have our domain model coupled with the persistence model. By decoupling them, the risk to expose the domain model almost disappears.

Other patterns reach a similar outcome, but they usually are used in more complex scenarios, such asCQRS,Data Mappers,CommandQuerySeparation, etc.

7. Conclusion

In this article, we saw the definition of theDTO Pattern, why it exists and how to implement it.

We also saw some of the common mistakes related to its implementation and ways to avoid them.

The code backing this article is available on GitHub. Once you'relogged in as aBaeldung Pro Member, start learning and coding on the project.

Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutelyNo-Ads as well asfinally withDark Mode, for a clean learning experience:

>> Explore a cleanBaeldung

Once the early-adopter seats are all used,the price will goup and stay at $33/year.

Partner – Orkes – NPI EA (cat = Spring)
announcement - icon

Modern software architecture is often broken. Slow deliveryleads to missed opportunities, innovation is stalled due toarchitectural complexities, and engineering resources areexceedingly expensive.

Orkes is the leading workflow orchestration platformbuilt to enable teams to transform the way they develop, connect,and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers canfocus on building mission critical applications without worryingabout infrastructure maintenance to meet goals and, simply put,taking new products live faster and reducing total cost ofownership.

Try a14-Day FreeTrial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag = Microservices)
announcement - icon

Modern software architecture is often broken. Slow deliveryleads to missed opportunities, innovation is stalled due toarchitectural complexities, and engineering resources areexceedingly expensive.

Orkes is the leading workflow orchestration platformbuilt to enable teams to transform the way they develop, connect,and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers canfocus on building mission critical applications without worryingabout infrastructure maintenance to meet goals and, simply put,taking new products live faster and reducing total cost ofownership.

Try a14-DayFree Trial of Orkes Conductor today.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

TheApache HTTP Client is a very robust library, suitablefor both simple and advanced use cases whentesting HTTPendpoints. Check out our guide covering basic request andresponse handling, as well as security, cookies, timeouts, andmore:

>> Downloadthe eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky processwith manypotential pitfalls. A solid grasp of thefundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications withourJava Concurrency guide:

>>Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become astaple of Java development. The basic operations like iterating,filtering, mapping sequences of elements are deceptively simple touse.

But these can also be overused and fall into some commonpitfalls.

Toget a better understanding on how Streams work and howto combine them with other language features, check out our guideto Java Streams:

>> Join Proand download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring,through theLearn Spring course:

>> CHECK OUTTHE COURSE

eBook Jackson – NPI EA – 3 (cat = Jackson)
Do JSON right with Jackson - book cover
Do JSON right with Jackson - icon
Do JSON right with Jackson
Download the E-book
1 Comment
Oldest
Newest
Inline Feedbacks
View all comments