库存CRUD应用:如何处理DuplicateKeyException并保留ModelAttributes?
解决方案
当处理更新错误需要返回编辑表单时,只需在返回视图前手动将acts和device属性添加到Model中即可,不需要使用重定向。修改后的updateDevice方法如下:
@PatchMapping("/{inventoryCard}") public String updateDevice(@ModelAttribute("device") @Valid Device device, BindingResult bindingResult, @PathVariable("inventoryCard") String inventoryCard, Model model){ // 添加Model参数 try{ deviceDAO.update(inventoryCard, device); } catch(DuplicateKeyException e){ bindingResult.rejectValue("inventoryCard", "error.inventoryCard", "This inventory card already used"); } if(bindingResult.hasErrors()){ // 将用户提交的device放回模型,保留已输入的内容 model.addAttribute("device", device); // 重新查询该设备的操作记录并添加到模型 model.addAttribute("acts", actDAO.showActsByDevice(inventoryCard)); return "property/edit_device.html"; } return "redirect:/device/show_all"; }
说明
- 给
updateDevice方法添加Model参数,Spring会自动注入该对象。 - 当验证失败或捕获到重复键异常时,先把用户提交的
device对象放回模型,这样表单能保留用户已输入的内容,同时将该设备的操作记录acts查询后添加到模型中。 - 直接返回编辑视图,而不是重定向,这样错误信息和模型数据能直接传递到视图,无需处理Flash属性的问题。
内容的提问来源于stack exchange,提问作者sirensonthewayy--
相关产品推荐
相关产品推荐

