@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
并且它永远不会改变。
答案 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(...)
) - 这不是额外的工作,如果以后出现问题,一切都是明确的,易于调试。