diff --git a/pom.xml b/pom.xml index e4e74747a..478677c3a 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,11 @@ org.springframework.boot spring-boot-starter-thymeleaf + + modelmapper + org.modelmapper + RELEASE + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/org/springframework/samples/petclinic/configuration/AppBean.java b/src/main/java/org/springframework/samples/petclinic/configuration/AppBean.java new file mode 100644 index 000000000..127a287da --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/configuration/AppBean.java @@ -0,0 +1,15 @@ +package org.springframework.samples.petclinic.configuration; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AppBean { + + @Bean + public ModelMapper modelMapper() { + return new ModelMapper(); + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/dto/OwnerDto.java b/src/main/java/org/springframework/samples/petclinic/dto/OwnerDto.java new file mode 100644 index 000000000..8a8a7ace5 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/dto/OwnerDto.java @@ -0,0 +1,77 @@ +package org.springframework.samples.petclinic.dto; + +public class OwnerDto { + + private Long id; + + private String firstName; + + private String lastName; + + private String address; + + private String city; + + private String telephone; + + public OwnerDto() { + } + + public OwnerDto(Long id, String firstName, String lastName, String address, String city, String telephone) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + this.city = city; + this.telephone = telephone; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/dto/PetDto.java b/src/main/java/org/springframework/samples/petclinic/dto/PetDto.java new file mode 100644 index 000000000..8adf6845c --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/dto/PetDto.java @@ -0,0 +1,60 @@ +package org.springframework.samples.petclinic.dto; + +import org.springframework.samples.petclinic.owner.Owner; +import org.springframework.samples.petclinic.owner.PetType; + +import java.time.LocalDate; + +public class PetDto { + + private Long id; + + private LocalDate birthDate; + + private PetType type; + + private Owner owner; + + public PetDto() { + } + + public PetDto(Long id, LocalDate birthDate, PetType type, Owner owner) { + this.id = id; + this.birthDate = birthDate; + this.type = type; + this.owner = owner; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDate getBirthDate() { + return birthDate; + } + + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + } + + public PetType getType() { + return type; + } + + public void setType(PetType type) { + this.type = type; + } + + public Owner getOwner() { + return owner; + } + + public void setOwner(Owner owner) { + this.owner = owner; + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/dto/VisitDto.java b/src/main/java/org/springframework/samples/petclinic/dto/VisitDto.java new file mode 100644 index 000000000..3830f7ecd --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/dto/VisitDto.java @@ -0,0 +1,57 @@ +package org.springframework.samples.petclinic.dto; + +import java.time.LocalDate; + +public class VisitDto { + + private Long id; + + private LocalDate date; + + private String description; + + private Integer petId; + + public VisitDto() { + } + + public VisitDto(Long id, LocalDate date, String description, Integer petId) { + this.id = id; + this.date = date; + this.description = description; + this.petId = petId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getPetId() { + return petId; + } + + public void setPetId(Integer petId) { + this.petId = petId; + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java index 79aa4cd9b..7f8f8202e 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java @@ -15,6 +15,9 @@ */ package org.springframework.samples.petclinic.owner; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.samples.petclinic.dto.OwnerDto; import org.springframework.samples.petclinic.visit.VisitRepository; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -45,6 +48,9 @@ class OwnerController { private VisitRepository visits; + @Autowired + private ModelMapper modelMapper; + public OwnerController(OwnerRepository clinicService, VisitRepository visits) { this.owners = clinicService; this.visits = visits; @@ -63,7 +69,8 @@ class OwnerController { } @PostMapping("/owners/new") - public String processCreationForm(@Valid Owner owner, BindingResult result) { + public String processCreationForm(@Valid OwnerDto ownerDto, BindingResult result) { + Owner owner = modelMapper.map(ownerDto, Owner.class); if (result.hasErrors()) { return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } @@ -80,7 +87,8 @@ class OwnerController { } @GetMapping("/owners") - public String processFindForm(Owner owner, BindingResult result, Map model) { + public String processFindForm(OwnerDto ownerDto, BindingResult result, Map model) { + Owner owner = modelMapper.map(ownerDto, Owner.class); // allow parameterless GET request for /owners to return all records if (owner.getLastName() == null) { @@ -114,8 +122,10 @@ class OwnerController { } @PostMapping("/owners/{ownerId}/edit") - public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, + public String processUpdateOwnerForm(@Valid OwnerDto ownerDto, BindingResult result, @PathVariable("ownerId") int ownerId) { + Owner owner = modelMapper.map(ownerDto, Owner.class); + if (result.hasErrors()) { return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } diff --git a/src/main/java/org/springframework/samples/petclinic/owner/PetController.java b/src/main/java/org/springframework/samples/petclinic/owner/PetController.java index a55e599af..078349b50 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/PetController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/PetController.java @@ -15,6 +15,10 @@ */ package org.springframework.samples.petclinic.owner; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.samples.petclinic.dto.OwnerDto; +import org.springframework.samples.petclinic.dto.PetDto; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.StringUtils; @@ -40,6 +44,9 @@ class PetController { private final OwnerRepository owners; + @Autowired + private ModelMapper modelMapper; + public PetController(PetRepository pets, OwnerRepository owners) { this.pets = pets; this.owners = owners; @@ -66,7 +73,8 @@ class PetController { } @GetMapping("/pets/new") - public String initCreationForm(Owner owner, ModelMap model) { + public String initCreationForm(OwnerDto ownerDto, ModelMap model) { + Owner owner = modelMapper.map(ownerDto, Owner.class); Pet pet = new Pet(); owner.addPet(pet); model.put("pet", pet); @@ -74,7 +82,10 @@ class PetController { } @PostMapping("/pets/new") - public String processCreationForm(Owner owner, @Valid Pet pet, BindingResult result, ModelMap model) { + public String processCreationForm(OwnerDto ownerDto, @Valid PetDto petDto, BindingResult result, ModelMap model) { + Owner owner = modelMapper.map(ownerDto, Owner.class); + Pet pet = modelMapper.map(petDto, Pet.class); + if (StringUtils.hasLength(pet.getName()) && pet.isNew() && owner.getPet(pet.getName(), true) != null) { result.rejectValue("name", "duplicate", "already exists"); } @@ -97,7 +108,9 @@ class PetController { } @PostMapping("/pets/{petId}/edit") - public String processUpdateForm(@Valid Pet pet, BindingResult result, Owner owner, ModelMap model) { + public String processUpdateForm(@Valid PetDto petDto, BindingResult result, OwnerDto ownerDto, ModelMap model) { + Pet pet = modelMapper.map(petDto, Pet.class); + Owner owner = modelMapper.map(ownerDto, Owner.class); if (result.hasErrors()) { pet.setOwner(owner); model.put("pet", pet); diff --git a/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java b/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java index 375980312..6d1dae503 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java @@ -19,6 +19,9 @@ import java.util.Map; import javax.validation.Valid; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.samples.petclinic.dto.VisitDto; import org.springframework.samples.petclinic.visit.Visit; import org.springframework.samples.petclinic.visit.VisitRepository; import org.springframework.stereotype.Controller; @@ -44,6 +47,9 @@ class VisitController { private final PetRepository pets; + @Autowired + private ModelMapper modelMapper; + public VisitController(VisitRepository visits, PetRepository pets) { this.visits = visits; this.pets = pets; @@ -79,7 +85,9 @@ class VisitController { // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called @PostMapping("/owners/{ownerId}/pets/{petId}/visits/new") - public String processNewVisitForm(@Valid Visit visit, BindingResult result) { + public String processNewVisitForm(@Valid VisitDto visitDto, BindingResult result) { + + Visit visit = modelMapper.map(visitDto, Visit.class); if (result.hasErrors()) { return "pets/createOrUpdateVisitForm"; }