Фрагмент Thymeleaf загружается перед выполнением метода - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть такой контроллер:

@Controller
public class DeviceController {

  @Inject
  private DeviceService deviceService;

  @ModelAttribute("devices")
  public List<Device> getDevices() {
    return deviceService.getAll();
  }

  @GetMapping({"/", "index.html"})
  public String showIndex() {
    return "index";
  }

  @DeleteMapping(value = "/devices/{id}")
  public String deleteOne(@PathVariable("id") long id) {
    deviceService.deleteOne(id);
    return "index :: devices";
  }
}

и такой шаблон Thymeleaf:

<table id="tbl_device" th:fragment="devices">
  <tr> <!-- header --> </tr>
  <tr th:each="e : ${devices}" th:object="${d}" th:id="'device_' + *{id}" th:fragment="'device_' + *{id}">
    <!-- columns -->
  </tr>
</table>

Когда я вызываю конечную точку /devices/{id} DELETE, я ожидаю, что онавернуть таблицу без удаленного устройства.Но он на самом деле возвращает таблицу, включая удаленное устройство.Когда я отлаживаю код, я вижу, что getDevices() вызывается раньше deleteOne(id).

Когда я вручную перезагружаю страницу после удаления, строка (правильно) больше не отображается.

Это почему?И (как) я могу изменить это поведение?
Спасибо

1 Ответ

0 голосов
/ 01 февраля 2019

Почему это так?

Рекомендую прочитать эту статью .В соответствии с этим:

В общем, Spring-MVC всегда будет сначала вызывать этот метод, прежде чем он вызовет какие-либо методы обработчика запросов. То есть методы @ModelAttribute вызываются до вызова методов контроллера, аннотированных @RequestMapping .Логика последовательности заключается в том, что объект модели должен быть создан до начала какой-либо обработки внутри методов контроллера.

Я сомневаюсь, что вы можете изменить порядок вызовов, но вы можете дополнительно передать модельприписать свой deleteOne метод и изменить его там.

@DeleteMapping(value = "/devices/{id}")
public String deleteOne(@PathVariable("id") long id, @ModelAttribute("devices") List<Device> devices) {
    deviceService.deleteOne(id);
    devices.remove( /* just deleted device */);
    return "index :: devices";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...