我有一个这样的控制器:
@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";
}
}
还有一个百里香叶模板,如下所示:
<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)
之前调用的。
当我在删除后手动重新加载页面时,该行(正确)不再显示。
为什么?以及(如何)我可以改变这种行为?
谢谢
为什么?
我建议阅读这篇文章。据此:
通常,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";
}