diff --git a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java
index 4f38bd5..f3f6f3f 100644
--- a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java
+++ b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java
@@ -27,12 +27,10 @@ import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.SessionAttributes;
-import org.springframework.web.bind.support.SessionStatus;
-import org.springframework.web.servlet.ModelAndView;
/**
* @author Juergen Hoeller
@@ -41,7 +39,6 @@ import org.springframework.web.servlet.ModelAndView;
* @author Michael Isvy
*/
@Controller
-@SessionAttributes("visit")
public class VisitController {
private final ClinicService clinicService;
@@ -56,32 +53,45 @@ public class VisitController {
public void setAllowedFields(WebDataBinder dataBinder) {
dataBinder.setDisallowedFields("id");
}
+
+ /**
+ * Called before each and every @RequestMapping annotated method.
+ * 2 goals:
+ * - Make sure we always have fresh data
+ * - Since we do not use the session scope, make sure that Pet object always has an id
+ * (Even though id is not part of the form fields)
+ * @param petId
+ * @return Pet
+ */
+ @ModelAttribute("visit")
+ public Visit loadPetWithVisit(@PathVariable("petId") int petId) {
+ Pet pet = this.clinicService.findPetById(petId);
+ Visit visit = new Visit();
+ pet.addVisit(visit);
+ return visit;
+ }
+ // Spring MVC calls method loadPetWithVisit(...) before initNewVisitForm is called
@RequestMapping(value = "/owners/*/pets/{petId}/visits/new", method = RequestMethod.GET)
public String initNewVisitForm(@PathVariable("petId") int petId, Map<String, Object> model) {
- Pet pet = this.clinicService.findPetById(petId);
- Visit visit = new Visit();
- pet.addVisit(visit);
- model.put("visit", visit);
return "pets/createOrUpdateVisitForm";
}
+ // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called
@RequestMapping(value = "/owners/{ownerId}/pets/{petId}/visits/new", method = RequestMethod.POST)
- public String processNewVisitForm(@Valid Visit visit, BindingResult result, SessionStatus status) {
+ public String processNewVisitForm(@Valid Visit visit, BindingResult result) {
if (result.hasErrors()) {
return "pets/createOrUpdateVisitForm";
} else {
this.clinicService.saveVisit(visit);
- status.setComplete();
return "redirect:/owners/{ownerId}";
}
}
@RequestMapping(value = "/owners/*/pets/{petId}/visits", method = RequestMethod.GET)
- public ModelAndView showVisits(@PathVariable int petId) {
- ModelAndView mav = new ModelAndView("visitList");
- mav.addObject("visits", this.clinicService.findPetById(petId).getVisits());
- return mav;
+ public String showVisits(@PathVariable int petId, Map<String, Object> model) {
+ model.put("visits", this.clinicService.findPetById(petId).getVisits());
+ return "visitList";
}
}