Всегда, когда слышала о проектно-я уже думал, в какой-то реализации или архитектура слишком сложным, то, что я привык. Однако, в последнее время, я осознал, что работал с проектно-что facilitava очень “разговор” между клиентскими системами и систем серверов и хотел бы, чтобы объяснить ее в данной статье.
Надеюсь, что понимание чего-то, что для меня, в общем, было супер сложным является более простым для вас.
Объект Передачи данных
Data Transfer Object (DTO), или известный в некоторых местах, только как Transfer Object (TO), это, просто, по умолчанию, который мы используем классы, которые имеют информацию, которые формируются из одной или более сущностей (классы, атрибуты сопоставляются с полями таблицы базы данных). Эти классы имеет целью упрощения, как система должна общаться с другой стороны, в отношении к какой-то процесс.
DTO на практике
Пример, который я показал ниже, учитывает процесс сохранения новой записи Пользователь
в базе данных, и ответ наш API будет возвращать.
В этом примере я буду с помощью реализации в Java com Весенняя загрузка .
Занятия
Наш класс UsuarioEntity (отвечает за отображение нашего класса и атрибуты таблицы и поля базы данных):
package com.leonardossev.dtoexemplo.model.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "usuario") public class UsuarioEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "nome") private String nome; @Column(name = "email", unique = true) private String email; @Column(name = "senha") private String senha; // Getters e Setters... }
Наш Repository (интерфейс отвечает за взаимодействие с базой данных):
package com.leonardossev.dtoexemplo.repository; import com.leonardossev.dtoexemplo.model.entity.UsuarioEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface UsuarioRepository extends JpaRepository{ }
Наш Сервис:
package com.leonardossev.dtoexemplo.service; import com.leonardossev.dtoexemplo.model.entity.UsuarioEntity; import com.leonardossev.dtoexemplo.repository.UsuarioRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UsuarioService { @Autowired private UsuarioRepository usuarioRepository; public UsuarioEntity salvarUsuario(UsuarioEntity usuario) { return this.usuarioRepository.save(usuario); } }
Наша Controller:
package com.leonardossev.dtoexemplo.controller; import com.leonardossev.dtoexemplo.model.entity.UsuarioEntity; import com.leonardossev.dtoexemplo.service.UsuarioService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(path = "/usuario") public class UsuarioController { @Autowired private UsuarioService usuarioService; @PostMapping public ResponseEntitysalvarUsuario(final @RequestBody UsuarioEntity usuario) { return new ResponseEntity (this.usuarioService.salvarUsuario(usuario), HttpStatus.CREATED); } }
Под управлением нашей приложение
Для проверки endpoint ответственности за сохранение записи в базу, я использую Insomnia .
Напоминая, что, если не которая ответит на вопрос, ни один порт, при запуске нашего приложения, он будет доступен на порту 8080.
Обратите внимание, что мы получаем именно информацию мы сохраняем в нашей базе данных. Но, в реальном приложении, вероятно, мы бы не хотели получить все данные таким образом.
Например: не будем хотеть, что пароль от нашего пользователя (без входа в заслугу шифрования) был выдержанным, таким образом.
Другой пример: если мы хотим принести сведения, относящиеся к пользователю, что не так, как в таблице пользователей.
В нашем случае, использование DTO может помочь нам решить этот вопрос таким образом, нам предлагают выбрать, какие данные мы хотим сделать, когда спасти новый пользователь.
Мы собираемся добавить следующий класс в свой проект:
package com.leonardossev.dtoexemplo.model.dto; public class UsuarioDTO { private Long id; private String nome; private String email; public UsuarioDTO(Long id, String nome, String email) { this.id = id; this.nome = nome; this.email = email; } // Getters e setters... }
Мы также будем сделать следующие настройки:
- Реализовать метод в классе
UsuarioEntity
что станет информацию классаUsuarioEntity
для получения информации-классаUsuarioDTO
; - Чтобы сделать наш endpoint возвращает объект класса
UsuarioDTO
.
Реализация метода для преобразования информации
В классе UsuarioEntity
создадим следующий метод:
public UsuarioDTO obterUsuarioDTO() { return new UsuarioDTO(this.id, this.nome, this.email); }
Изменение рентабельность конечной сохранить пользователя
В нашем пакете, мы будем настроить метод реализации сохранить пользователя (Userentity user)
так что он может возвращать объект класса UsuarioDTO
:
public UsuarioDTO salvarUsuario(UsuarioEntity usuario) { var usuarioSalvo = this.usuarioRepository.save(usuario); return usuarioSalvo.obterUsuarioDTO(); }
Кроме того, необходимо, делаем настройки в методе нашего controller:
@PostMapping public ResponseEntitysalvarUsuario(final @RequestBody UsuarioEntity usuario) { return new ResponseEntity (this.usuarioService.salvarUsuario(usuario), HttpStatus.CREATED); }
Таким образом, когда мы запустили приложение, и мы стараемся сохранить нового пользователя, мы получаем следующие данные:
Обратите внимание, что мы не получаем информацию от пароля пользователя.
Заключительные соображения
Несмотря на простоту, сумели отразить многочисленные случаи, которые у нас есть в нашей повседневной жизни, что изменение формы информации, которая у нас есть, сохраненных в наших возможных источников данных.
Репозиторий с примером из статьи можно узнать здесь .
Характеристика
https://www.baeldung.com/hibernate-identifiers https://stackabuse.com/data-transfer-object-pattern-in-java-implementation-and-mapping/
В случае, если у вас есть вопросы, я всегда открыт для предложений, критики и идей! o/
Оригинал: “https://dev.to/leonardossev/pt-br-padrao-de-projeto-data-transfer-object-3e0o”