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";
}