Dtos Mappers
In this lesson, we'll implement the DTOs and Mappers needed to handle event creation in our REST API.
These components help us maintain a clear separation between our API contract and internal domain model, while ensuring data validation at the API boundary.
Understanding DTOs and Their Purpose
Data Transfer Objects (DTOs) serve as specialized objects for transferring data between our API and clients. Unlike our domain models, DTOs:
- Are tailored specifically for API communication
- Include validation rules for request data
- Can be modified without affecting our domain models
- Help prevent exposing internal implementation details
Create Request DTOs
Let's create our request DTOs with proper validation:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateEventRequestDto {
@NotBlank(message = "Event name is required")
private String name;
private LocalDateTime start;
private LocalDateTime end;
@NotBlank(message = "Venue information is required")
private String venue;
private LocalDateTime salesStart;
private LocalDateTime salesEnd;
@NotNull(message = "Event status must be provided")
private EventStatusEnum status;
@NotEmpty(message = "At least one ticket type is required")
@Valid
private List<CreateTicketTypeRequestDto> ticketTypes;
}For ticket types, we create a separate DTO with its own validations:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateTicketTypeRequestDto {
@NotBlank(message = "Ticket type name is required")
private String name;
@NotNull(message = "Price is required")
@PositiveOrZero(message = "Price must be zero or greater")
private Double price;
private String description;
private Integer totalAvailable;
}Creating Response DTOs
Response DTOs represent the data we send back after creating an event:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateEventResponseDto {
private UUID id;
private String name;
private LocalDateTime start;
private LocalDateTime end;
private String venue;
private LocalDateTime salesStart;
private LocalDateTime salesEnd;
private EventStatusEnum status;
private List<CreateTicketTypeResponseDto> ticketTypes;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}Implementing the Mapper
MapStruct helps us convert between DTOs and domain objects:
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface EventMapper {
CreateTicketTypeRequest fromDto(CreateTicketTypeRequestDto dto);
CreateEventRequest fromDto(CreateEventRequestDto dto);
CreateEventResponseDto toDto(Event event);
}Summary
- Created the
CreateEventRequestDto - Created the
CreateEventResponseDto - Created the
EventMapperinterface - The DTOs make use of validation annotations to ensure data consistency