【问题标题】:Change model (@ModelAttribute) depending on a request parameter根据请求参数更改模型(@ModelAttribute)
【发布时间】:2014-10-25 07:52:06
【问题描述】:

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

@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 并且它永远不会改变。

【问题讨论】:

  • 是的,因为这发生在showOrders()。当请求转到带有@ModelAttribute 的控制器方法时,首先执行,然后是映射器。因此,currentStatus 被 GET 请求覆盖。
  • @DarshanLila 我的问题有什么解决方案?
  • 在你的get方法中为currentStatus使用不同的属性名。

标签: java spring-mvc model modelattribute


【解决方案1】:

您可以将@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(...)) - 没有太多额外的工作,而且如果以后出现问题,一切都很明确且易于调试。

【讨论】:

  • 非常感谢!这个解决方案非常简单巧妙!谢谢你警告@ModelAttribute!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2015-05-26
  • 2017-08-24
  • 2014-07-26
相关资源
最近更新 更多