Изменить модель (@ModelAttribute) в зависимости от параметра запроса

1

Помоги мне, пожалуйста. У меня есть код контроллера:

@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 и это никогда не изменится.

  • 0
    Да, потому что это происходит в showOrders() . Когда запрос переходит к этому методу контроллера, @ModelAttribute выполняется @ModelAttribute а затем - преобразователь. Следовательно, currentStatus перезаписывается для запроса GET.
  • 0
    @DarshanLila Какое решение моей проблемы?
Показать ещё 1 комментарий
Теги:
spring-mvc
model
modelattribute

1 ответ

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(...)) - это не так много дополнительной работы, и все явственно и легко отлаживается, если проблема выйдет позже.

  • 0
    Большое спасибо! Это решение очень простое и оригинальное! И спасибо, что предупредили о @ModelAttribute!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню