Зачем нужен dto mapper?
Зачем нужен dto mapper? К примеру ModelMapper. Во всех примерах классы dto и entity идентичны. Если нужно отдавать json с полями отличающимися от модели все равно нужно писать маппинг, зачем тогда использовать библиотеки? В чем выгода? К примеру
{
"data": [
{
"id": 2,
"name": "Иванов Иван Ильич",
"status": "Председатель",
"filter": [
"дирекция"
],
"phones": [],
"email": [
"[email protected]",
"[email protected]"
],
"image": "Ivanoff828",
"thumbImage": "Ivanoff64"
},
{
"id": 14,
"name": "Петров Петр Анатольевич",
"status": "Заместитель",
"filter": [
"дирекция",
"совет"
],
"phones": [],
"email": [
"[email protected]",
"[email protected]"
],
"image": "Sh828",
"thumbImage": "Sh64"
}
}
Entity описываются классом
@Entity
public class Contact extends BaseEntity {
private String surname;
private String name;
private String patronymic;
@OneToMany(mappedBy = "contact", orphanRemoval = true, fetch = FetchType.EAGER)
private Set<Phone> phones = new LinkedHashSet<>();
@OneToMany(mappedBy = "contact", orphanRemoval = true, fetch = FetchType.EAGER)
private Set<Email> emails = new LinkedHashSet<>();
private String position;
private String organisation;
}
@Entity
public class Email extends BaseEntity {
private String email;
@ManyToOne
@JoinColumn(name = "contact_id")
private Contact contact;
}
@Entity
public class Phone extends BaseEntity {
private String number;
private String type;
@ManyToOne
@JoinColumn(name = "contact_id")
private Contact contact;
}
Есть ли смысл в этом случае использовать готовый маппер dto или лучше писать свой?
Ответы (1 шт):
Библиотеки позволяют избавиться от написания избыточного кода в случаях, когда имена полей DTO и DAO объектов совпадают.
А еще если посмотреть в сторону библиотеки MapStruct, то увидите, что можно не писать кастомные конвертеры, а только при использовании аннотаций производить маппинг объектов.
Пример:
@Mapper(componentModel = "spring", uses = {})
public interface UserMapper extends EntityMapper<User, UserDTO> {
@Mapping(target = "userName", source = "name")
User toEntity(UserDTO dto);
@Mapping(target = "name", source = "userName")
UserDTO toDto(User user);
}
Так сложилось в мире энтерпрайз джавы, что DTO объекты используются для сериализации данных и передачей их между системами, и соответственно для десериализации обратно в объект, то есть являются объектами передачи данных. DTO объекты не содержат поведения и не содержат методов бизнес логики.
Теперь мы можем говорить про DAO как об отдельном объекте, который является объектом, отражающем данные, например, баз данных, как это часто приходится и может содержать поведение, то есть иметь какие-либо методы для управления состоянием этого объекта или иметь бизнес логику.
Почему же есть DAO и DTO? Чтобы разнести ответственность, вот и все.