DTO - przykład zastosowania w Spring?

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

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.

7

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

możesz np:

/*
* 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

@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:

@Autowired
private BaseConverter<User, UserDTO> userConverter;
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 ?

0

To zależy od potrzeb

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.
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.

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.

0

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

Klasa Customer:

@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:

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1