我正在编写一个类似向导的控制器,它可以跨多个视图处理单个bean的管理。我使用@SessionAttributes来存储bean,使用SessionStatus.setComplete()来终止最终调用中的会话。但是,如果用户放弃向导并转到应用程序的另一部分,我需要强制Spring在返回时重新创建@ModelAttribute。例如:
@Controller
@SessionAttributes("commandBean")
@RequestMapping(value = "/order")
public class OrderController
{
@RequestMapping("/*", method=RequestMethod.GET)
public String getCustomerForm(@ModelAttribute("commandBean") Order commandBean)
{
return "customerForm";
}
@RequestMapping("/*", method=RequestMethod.GET)
public String saveCustomer(@ModelAttribute("commandBean") Order commandBean, BindingResult result)
{
[ Save the customer data ];
return "redirect:payment";
}
@RequestMapping("/payment", method=RequestMethod.GET)
public String getPaymentForm(@ModelAttribute("commandBean") Order commandBean)
{
return "paymentForm";
}
@RequestMapping("/payment", method=RequestMethod.GET)
public String savePayment(@ModelAttribute("commandBean") Order commandBean, BindingResult result)
{
[ Save the payment data ];
return "redirect:confirmation";
}
@RequestMapping("/confirmation", method=RequestMethod.GET)
public String getConfirmationForm(@ModelAttribute("commandBean") Order commandBean)
{
return "confirmationForm";
}
@RequestMapping("/confirmation", method=RequestMethod.GET)
public String saveOrder(@ModelAttribute("commandBean") Order commandBean, BindingResult result, SessionStatus status)
{
[ Save the payment data ];
status.setComplete();
return "redirect:/order";
}
@ModelAttribute("commandBean")
public Order getOrder()
{
return new Order();
}
}
如果用户向应用程序发出将触发“getCustomerForm”方法的请求(即http://mysite.com/order),并且已经存在“commandBean”会话属性,则不会调用“getOrder”。我需要确保在这种情况下创建一个新的Order对象。我只需要在getCustomerForm中手动重新填充吗?
思考?如果我不清楚,请告诉我。
答案 0 :(得分:0)
是的,听起来您可能需要在getCustomerForm
中手动重新填充它 - 如果属性是@SessionAttributes
的一部分且出现在会话中,那么就像您说@ModelAttribute
方法一样没有叫它。
替代方法可能是定义一个只有getCustomerForm
方法的新控制器以及@ModelAttribute method
但类型上没有@SessionAttributes,这样就可以保证调用@ModelAttribute方法,然后继续使用现有控制器中现有的@RequestMapped方法。