DTO - przykład zastosowania w Spring?

DTO - przykład zastosowania w Spring?
EF
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:53
0

Cześć,
Chciałem się wdrożyć w zastosowanie wzorca DTO w projekcie springowym, jednak poza suchymi definicjami co to DTO i kiedy używamy nie mogę znaleźć ani jednego kompletnego projektu do wglądu jak to jest ze sobą powiązane i zgrywa się w całość. Może ktoś kojarzy taki projekt na GitHubie albo coś?
Jedyne co udało mi się w miarę namierzyć, ale może ktoś macie coś bardziej rozbudowanego?
https://github.com/krams915/spring-neo4j-tutorial/tree/master/spring-neo4j-tutorial

Tancerd
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 5 lat
  • Postów:87
1

Ale czemu potrzebujesz czegoś bardziej zaawansowanego? Dto to nie jest żaden przełomowy wzorzec z fajerwekami. Zamiast zwracać encję bazodanową zwracasz zbiór danych który bezpośrednio nie ma nic wspólnego z BD i tyle.

niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
7

@Tancerd jemu chodzi o przykładowy mechanizm jak to zrobić - a nie o filozofię.

możesz np:

Kopiuj
/*
* Convert database object to DTO or DTO to database object
* database object means entity(so class that are marked as @Entity)
*
* F-from
* T-to
*/
@FunctionalInterface
public interface BaseConverter<F,T> {

    public T convert(F from);

    default public Collection<T> convertAll(Collection<F> fElements){
        Collection<T> convertedElement =
                fElements.stream()
                        .map(element -> convert(element))
                        .collect(Collectors.toList());

        return convertedElement;
    }
}

Mieć interface czegoś co będzie konwertować Twoje obiekty (Model -> DTO)

i potem implementować i generować beany

Kopiuj
@Component
public class DefaultUserConverter implements BaseConverter<User, UserDTO> {

    @Override
    public UserDTO convert(User from) {
        UserDTO user = new UserDTO();
        user.setUsername(from.getUsername());
        user.setPassword(from.getPassword());
        user.setEnabled(from.getEnabled());
        return user;
    }
}

a gdzieś w kodzie, np w serwisie:

Kopiuj
@Autowired
private BaseConverter<User, UserDTO> userConverter;

"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
0

Ok, a co jezeli encja ma obiekty ?
Np klasa User posiada
private Address address
private Car car
Czy w Dto przekazujemy całe obiekty czy lepiej jest posługiwac sie id-kami ?

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

To zależy od potrzeb


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
0

Zobacz kod źródłowy do tej ksiażki
https://www.apress.com/9781430226321

  • ten główny projekt (nie na Grails czy Roo), jest tam m.in. mapowanie na/z DTO Dozerem. Ma to już z parę lat, sam tego nie odpalałem przy czytaniu, ale jakaś idea tam jest pokazana.
UJ
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Postów:2
0

Może mi ktoś wyjaśnić po co się robi konwersje DTO? Nie mogę znaleźć żadnego prostego w zrozumieniu artykułu na ten temat.
Patrząc na funkcję convert nasuwa mi się pytanie po co tworzyć obiekt User na podstawie obiektu User? Funkcji convertAll też nie rozumiem niestety.
Bardzo proszę o pomoc w zrozumieniu tematu.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

@UserJava bo na przykład chcesz z tych obiektów wygenerować jsona i wysłać do klienta? I nie chcesz umieszczać tam wielu zbędnych informacji które miałeś w encji (typu ID) albo w obiekcie domenowym na którym operowałeś? Zwykle DTO to jest tylko prosta struktura danych, podczas gdy obiekty domenowe na których pracujesz w aplikacji zwykle są dużo bardziej złożone.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
UJ
Wielkie dzięki za pomoc, rozumiem ideę!
G9
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 7 lat
  • Postów:12
0

Jak utworzyć klasę CustomerDTO na podstawie klas Customer oraz Phone?

Klasa Customer:

Kopiuj
@Entity
@Table(name = "customers")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "tax_number", nullable = false, columnDefinition = "BIGINT(10)")
    private Long taxNumber;

    @Column(name = "company_name", nullable = false, columnDefinition = "VARCHAR(300)")
    private String companyName;

    @Column(name = "street", nullable = false, columnDefinition = "VARCHAR(80)")
    private String street;

    @Column(name = "building_number", nullable = false, columnDefinition = "VARCHAR(10)")
    private String buildingNumber;

    @Column(name = "office_number", columnDefinition = "VARCHAR(10)")
    private String officeNumber;

    @OneToMany(mappedBy = "customer")
    private List<Phone> phoneNumbers;

    @Column(name = "email", columnDefinition = "VARCHAR(80)")
    private String email;

    @Column(name = "website", columnDefinition = "VARCHAR(80)")
    private String website;
}

Klasa Phone:

Kopiuj
@Entity
@Table(name = "phones")
public class Phone {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "phone_number", nullable = false, columnDefinition = "CHAR(10)")
    private String phoneNumber;

    @Column(name = "number_desc", columnDefinition = "VARCHAR(160)")
    private String phoneNumberDescription;

    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;
}

Chcę utworzyć z tych dwóch klas klasę CustomerDTO aby odpowiadając JSONem na żądanie GET zawierał on listę Customers wraz z telefonami.
Jak dokładnie powinna wyglądać taka klasa DTO?

0

Istnieja tez mapujace frameworki jak mapstruct itp.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.