Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is a DTO in Spring Boot?
A DTO (Data Transfer Object) is a simple object used to transfer data between layers or systems without exposing the internal details of the entity. It usually contains only fields and getters/setters.
Click to reveal answer
beginner
Why use nested DTOs in Spring Boot?
Nested DTOs help organize complex data structures by embedding one DTO inside another. This keeps data clear and manageable when transferring related objects together.
Click to reveal answer
intermediate
How do you define a nested DTO in Spring Boot?
You create a DTO class that contains fields of other DTO types. For example, a UserDTO can have an AddressDTO field to represent the user's address inside the user data.
Click to reveal answer
intermediate
What is a common use case for nested DTOs?
When you want to send or receive complex JSON objects in REST APIs, nested DTOs map the JSON structure to Java objects cleanly, making it easier to handle related data.
Click to reveal answer
intermediate
How do nested DTOs improve code maintainability?
They separate concerns by grouping related data, making the code easier to read, test, and update without affecting unrelated parts.
Click to reveal answer
What does a nested DTO contain?
ADatabase connection details
BOnly primitive data types
COther DTO objects as fields
DSpring Boot annotations only
✗ Incorrect
Nested DTOs contain other DTO objects as fields to represent complex data structures.
Why avoid exposing entities directly in APIs?
AEntities do not support nested data
BEntities may expose sensitive or unnecessary data
CEntities cannot be serialized
DEntities are always immutable
✗ Incorrect
Using DTOs helps avoid exposing sensitive or internal details of entities in APIs.
Which annotation is commonly used to create DTOs in Spring Boot?
A@Data (from Lombok)
B@RestController
C@Entity
D@Service
✗ Incorrect
@Data from Lombok generates getters/setters, making DTO creation easier.
How does a nested DTO relate to JSON in REST APIs?
AIt flattens JSON into a single string
BIt prevents JSON serialization
CIt encrypts JSON data
DIt maps nested JSON objects to Java objects
✗ Incorrect
Nested DTOs map nested JSON objects to Java objects for easy data handling.
What is a benefit of using nested DTOs?
AImproves data structure clarity
BIncreases database size
CSlows down API responses
DRemoves the need for controllers
✗ Incorrect
Nested DTOs improve clarity by organizing related data together.
Explain how nested DTOs help organize data in a Spring Boot application.
Think about how you would group related information like a user and their address.
You got /4 concepts.
Describe a scenario where nested DTOs are useful in REST API design.
Imagine sending user info with multiple addresses or contacts.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of using Nested DTOs in Spring Boot applications?
easy
A. To handle HTTP requests without controllers
B. To group related data inside other data objects for better structure
C. To replace entity classes with simpler objects
D. To improve database query performance automatically
Solution
Step 1: Understand DTO role
DTOs (Data Transfer Objects) are used to carry data between processes or layers.
Step 2: Identify Nested DTO purpose
Nested DTOs group related data inside other DTOs to represent complex data structures clearly.
Final Answer:
To group related data inside other data objects for better structure -> Option B
Quick Check:
Nested DTOs = Group related data [OK]
Hint: Nested DTOs organize data inside other objects [OK]
Common Mistakes:
Thinking nested DTOs improve database speed
Confusing DTOs with entities
Assuming nested DTOs replace controllers
2. Which of the following is the correct way to declare a nested DTO class inside a parent DTO in Spring Boot?
easy
A. public class ParentDTO { private class ChildDTO { private String name; } }
B. public class ParentDTO { class ChildDTO { private String name; } }
C. public class ParentDTO { public static class ChildDTO { private String name; } }
D. public class ParentDTO { static class ChildDTO { public String name; } }
Solution
Step 1: Check nested class modifiers
Static nested classes are recommended for DTOs to avoid implicit reference to outer class.
Step 2: Validate access modifiers
Public static nested class with private fields and getters/setters is standard practice.
Final Answer:
public class ParentDTO { public static class ChildDTO { private String name; } } -> Option C
Quick Check:
Static nested class with public modifier = public class ParentDTO { public static class ChildDTO { private String name; } } [OK]
Hint: Use public static nested class for nested DTOs [OK]
Common Mistakes:
Using non-static nested classes causing memory leaks
Declaring nested class as private making it inaccessible
Using public fields instead of private with getters/setters
3. Given the following nested DTO classes, what will be the output of System.out.println(order.getCustomer().getName()); if order is initialized as below?
public class OrderDTO {
private CustomerDTO customer;
public CustomerDTO getCustomer() { return customer; }
public void setCustomer(CustomerDTO customer) { this.customer = customer; }
public static class CustomerDTO {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
}
OrderDTO order = new OrderDTO();
OrderDTO.CustomerDTO cust = new OrderDTO.CustomerDTO();
cust.setName("Alice");
order.setCustomer(cust);
medium
A. Alice
B. null
C. Compilation error
D. Runtime NullPointerException
Solution
Step 1: Analyze object initialization
The customer object is created and its name is set to "Alice" before being assigned to order.
Step 2: Check method calls
Calling order.getCustomer().getName() returns the name "Alice" as set previously.
Final Answer:
Alice -> Option A
Quick Check:
Nested DTO getter returns set value = Alice [OK]
Hint: Set nested DTO fields before accessing getters [OK]
Common Mistakes:
Forgetting to set nested DTO before calling getter
Confusing null with empty string
Assuming compilation error due to nested class
4. Identify the error in the following nested DTO code snippet:
public class UserDTO {
private AddressDTO address;
public static class AddressDTO {
private String city;
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
}
public AddressDTO getAddress() { return address; }
public void setAddress(AddressDTO address) { this.address = address; }
}
UserDTO user = new UserDTO();
user.getAddress().setCity("Paris");
medium
A. Compilation error due to missing constructor
B. No error, code runs correctly
C. IllegalAccessError on accessing city field
D. NullPointerException because address is not initialized
Solution
Step 1: Check object initialization
The address field in UserDTO is never initialized, so it is null by default.
Step 2: Analyze method call
Calling user.getAddress().setCity("Paris") tries to call setCity on null, causing NullPointerException.
Final Answer:
NullPointerException because address is not initialized -> Option D
5. You have a nested DTO structure where OrderDTO contains a list of ItemDTO objects. You want to convert this nested DTO into a flat list of item names using Java streams. Which code snippet correctly achieves this?
public class OrderDTO {
private List<ItemDTO> items;
public List<ItemDTO> getItems() { return items; }
public void setItems(List<ItemDTO> items) { this.items = items; }
public static class ItemDTO {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
}
OrderDTO order = ...; // initialized with items
hard
A. List<String> names = order.getItems().stream().map(OrderDTO.ItemDTO::getName).toList();
B. List<String> names = order.getItems().stream().flatMap(ItemDTO::getName).collect(Collectors.toList());
C. List<String> names = order.getItems().map(ItemDTO::getName).collect(Collectors.toList());
D. List<String> names = order.getItems().stream().map(item -> item.name).collect(Collectors.toList());
Solution
Step 1: Understand stream mapping
To get a list of names, map each ItemDTO to its name using map(OrderDTO.ItemDTO::getName).
Step 2: Collect results
Use toList() (Java 16+) or collect(Collectors.toList()) to gather results into a list.
Final Answer:
List<String> names = order.getItems().stream().map(OrderDTO.ItemDTO::getName).toList(); -> Option A