Mapowanie Encji do DTO i na odwrót

0

Cześć!
Nie wiedziałem gdzie umieścić takie mapowanie, bo potrzebuję dla kilku encji, więc wykombinowałem coś takiego:

public interface Mapper<E, D> {

    E toEntity(D dto);

    D toDto(E entity);
}

Przykładowa implementacja:

@Component
public class UserMapper implements Mapper<User, UserDTO> {

    private final PasswordEncoder passwordEncoder;

    @Autowired
    public UserMapper(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    public User toEntity(UserDTO dto) {
            User user = new User();
            user.setName(dto.getName());
            ...

            return user;
    }

    @Override
    public UserDTO toDto(User entity) {
        UserDTO userDto = new UserDTO();
        userDto.setUserId(entity.getId());
        ...

        return userDto;
    }

I serwis, DI przez konstruktor.

private final Mapper<User, UserDTO> userMapper;

Niby działa, ale czy taka praktyka jest w porządku? Wybaczcie za głupie pytanie, uczę się :)

2

Jest spoko. Tylko w mapperze, zamiast kolejnych wywołań setterów obiektu, można użyć jakiegoś buildera tego modelu ;)

1
  1. Poczytaj o czyms takim co nazywa sie Orika, Dozer i ModelMapper.
  2. Tak taka praktyka jest wporzadku
  3. Przy bardziej skomplikowanych mapperach mozesz zastanowic sie nad oddzieleniem mapperow dto -> entity aa entity -> dto od siebie
Pinek napisał(a):

Jest spoko. Tylko w mapperze, zamiast kolejnych wywołań setterów obiektu, można użyć jakiegoś buildera tego modelu ;)

tj. poczytaj o Lombok i uzyj Buildera

1

Albo konstruktora z argumentami :)
To w sumie zależy jak złożone obiekty są ;)

1

Użyj narzędzia (to się robi moje ulubione powiedzenie)

http://modelmapper.org/

0
Koziołek napisał(a):

Użyj narzędzia (to się robi moje ulubione powiedzenie)

http://modelmapper.org/

Hmm nie wiem czy ten sposób nie przyprawi problemów, gdy w DTO będą longowe idki a w modelu całe obiekty (w mapperze wyciąganie obiektu z bazy na podstawie id)

2

Taka uwaga dla niektórych.
W pewnym momencie, niektórych z was, w trakcie systemów z takimi maperami mogą zacząć mieć wątpliwości....
Czy aby na pewno programowanie systemów polega na pisaniu / konfigurowaniu maperow i przelewaniu z getterów w settery? Czy java to przewalanie między DBO, ETO, CTO, DTO , SroTO, PstroTO ?

No więc... dla ustalenia uwagi. Macie rację! To jest porypane.

Fucked Up

Co poszło nie tak?
Używacie złych narzędzi (albo źle ich używacie) i próbujecie ich tępote korygować kolejnymi tępymi narzędziami (dozer...).
Przede wszystkim problem sprawia wam JPA. Ale gdybyście tak częściej korzystali z querowania do niemutowalnych obiektów (projekcje?)- to trochę by wam ulżyło.
Przejdzcie na JOOQ, a ulży wam przy zapisie.
Zróbie #DROPDB, a ulży wam całkiem :-)
A tak naprawdę sedno problemu to to, że robicie CRUDy. Ogarnijcie się! Jest XXI wiek. Zacznijcie robić systemy z myślą o użytkownikach i GUI jakim się będą posługiwać... a problem maperów zacznie wam naturalnie znikać.

Btw. czasem robię mapery, ale moment, w którym potrzebuje do tego frameworka wyznacza definitywnie moment, w którym właśnie zj....łem projekt.
(Da się z tego wybrnąć).

0

Dzięki za wszystkie odpowiedzi, nie sądziłem że tyle ich dostanę :)
@Pinek @karolinaa:
W sumie to używam Lomboka, że też nie wpadłem żeby dodać adnotację Builder...
@jarekr000000:
Z pewnością to co piszesz jest warte uwagi, ale aktualnie raczej nie dla mnie. Wrócę do tego kiedyś, jak nabiorę trochę doświadczenia. Póki co uczę się sam i niedługo będę się starać o pierwszy staż, bądź pierwszą pracę. W każdym razie dzięki :)

EDIT:
Co jeśli DTO i encja mają inne, dodatkowe pola? Taki mapper też da radę?

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