在Spring MVC 3.1中强制初始化@ModelAttributes

时间:2012-07-27 17:20:27

标签: spring session spring-mvc

我正在编写一个类似向导的控制器,它可以跨多个视图处理单个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中手动重新填充吗?

思考?如果我不清楚,请告诉我。

1 个答案:

答案 0 :(得分:0)

是的,听起来您可能需要在getCustomerForm中手动重新填充它 - 如果属性是@SessionAttributes的一部分且出现在会话中,那么就像您说@ModelAttribute方法一样没有叫它。

替代方法可能是定义一个只有getCustomerForm方法的新控制器以及@ModelAttribute method但类型上没有@SessionAttributes,这样就可以保证调用@ModelAttribute方法,然后继续使用现有控制器中现有的@RequestMapped方法。