根据请求参数更改模型(@ModelAttribute)

时间:2014-09-01 06:15:50

标签: java spring-mvc model modelattribute

请帮助我。 我有这样的控制器代码:

@RequestMapping(method = RequestMethod.GET)
public String showOrders(@RequestParam(value = "status", required = false) String status, Model model) {
    if(status != null) {
        Order.Status orderStatus = Order.Status.valueOf(status);
        if (orderStatus != null) model.addAttribute("currentStatus", orderStatus);
    }

    return "admin/orders";
}

@ModelAttribute("currentStatus")
public Order.Status populateCurrentStatus() {
    return Order.Status.PAYMENT;
}

@ModelAttribute("orders")
public List<Order> populateOrders(@ModelAttribute("currentStatus") Order.Status status) {
    return orderBo.getByStatus(status);
}

我希望默认currentStatus等于Order.Status.PAYMENT,但如果控制器收到带参数status的GET请求(方法showOrders上),则替换模型中的currentStatus到请求中传输的status。 并且populateOrders应根据新状态返回不同的订单列表。但不幸的是,这种情况并没有发生。方法populateOrders总是currentStatus等于Order.Status.PAYMENT并且它永远不会改变。

1 个答案:

答案 0 :(得分:2)

您可以在@RequestParam定义中添加@ModelAttribute,以便以不同的方式填充@ModelAttribute,具体取决于请求参数。

这应该有效:

@RequestMapping(method = RequestMethod.GET)
public String showOrders() {
    //no need to manually modify currentStatus in the model anymore
    return "admin/orders";
}

@ModelAttribute("currentStatus")
public Order.Status populateCurrentStatus(@RequestParam(value = "status", defaultValue = "PAYMENT") String status) {    
    return Order.Status.valueOf(status);
}

@ModelAttribute("orders")
public List<Order> populateOrders(@ModelAttribute("currentStatus") Order.Status status) {
    return orderBo.getByStatus(status);
}

个人注意事项:

我个人不喜欢Spring的@ModelAttribute系统来定义默认模型属性,特别是在更复杂的模型或更复杂的控制器中。它变得难以维护,因为很难控制究竟进入模型的内容(例如,对于某些请求,您可能不希望填充整个模型,例如,您只需要currentStatus而不是订单列表。我更喜欢填充手动模型(Model.addAttribute(...)) - 这不是额外的工作,如果以后出现问题,一切都是明确的,易于调试。