Nie bardzo rozumiem o co w tym chodzi, a ciężko znaleźć jakiś prosty przykład, w którym będzie opisanie oprócz tego 'co' to jeszcze 'dlaczego'. Staram się naśladować znaleziony w sieci kod, ale czasami jest to dla mnie nielogiczne. Poniżej przykładowy kontroler:
@RequestMapping(value = "/contact/new", method = RequestMethod.POST)
public String addContact(@Valid Contact contact, BindingResult result,
SessionStatus status, RedirectAttributes attributes) {
if (result.hasErrors()) {
return CONTACT_FORM_VIEW;
} else {
ContactDTO contactDTO = ContactUtils.contactToContactDTO(contact);
Contact added = contactService.add(contactDTO);
logger.info("Added contact with information: {}", added);
status.setComplete();
addFeedbackMessage(attributes, FEEDBACK_MESSAGE_KEY_CONTACT_ADDED,
added.getFirstName(), added.getLastName());
return "redirect:/contacts";
}
}
Jeżeli cokolwiek zrozumiałem z DTO, to chodzi o to, żeby w ramach logiki biznesowej operować na obiekcie, ale do klienta przekazywać DTO i od niego odbierać DTO - czyli uproszczony obiekt, niezawierający żadnych metod (to tak w skrócie). W takim razie dlaczego w powyższym kodzie odbieramy obiekt, następnie zamieniamy go na DTO, po to tylko, żeby za chwilę zamienić go z DTO z powrotem na obiekt, żeby dodać go do bazy (metoda add zamienia DTO na obiekt).
Z kolei poniżej przekazujemy do modelu obiekt, a nie DTO.
@RequestMapping(value = "/contact/{contactId}", method = GET)
public String contactDisplayPage(@PathVariable("contactId") Long id, Model model)
throws ContactNotFoundException {
logger.info("Showing contact page for contact with id: {}", id);
Contact found = contactService.findContactById(id);
logger.info("Found contact: {}", found);
model.addAttribute(MODEL_ATTRIBUTE_CONTACT, found);
return CONTACT_VIEW;
}
Nie wiem czy to wszystko jest OK (a jeżeli tak to czemu akurat tak się to robi), czy może kod nie jest jeszcze 'posprzątany'. Czy przy małych projekcikach jest sens stosowania w ogóle DTO? Czy nie powoduje to tylko zmniejszenia czytelności kodu i większego nakładu pracy?
Całość kodu tu: https://github.com/mintster/spring-data/tree/v0.1.9