Помоги мне, пожалуйста. У меня есть код контроллера:
@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
, но если контроллер получает запрос GET с status
аргумента (на методе showOrders
), замените currentStatus
в модели на status
переданный в запросе. И populateOrders
должен вернуть другой список заказов в соответствии с новым статусом. Но, к сожалению, этого не происходит. Метод populateOrders
всегда получает currentStatus
равный Order.Status.PAYMENT
и это никогда не изменится.
Вы можете добавить @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(...)
) - это не так много дополнительной работы, и все явственно и легко отлаживается, если проблема выйдет позже.
showOrders()
. Когда запрос переходит к этому методу контроллера,@ModelAttribute
выполняется@ModelAttribute
а затем - преобразователь. Следовательно,currentStatus
перезаписывается для запроса GET.