Spring Boot使用@DeleteMapping注解无法删除订单问题求助
问题根源排查
- 控制器层所有请求处理方法修饰符为
private:Spring MVC无法扫描识别私有方法作为请求入口,请求匹配不到对应处理逻辑 @DeleteMapping标注的删除方法返回值为void:处理完请求后没有返回视图或重定向指令,浏览器无内容可渲染直接显示空白页- 表单提交DELETE请求的过滤器未开启:Spring Boot 2.3+版本默认关闭
HiddenHttpMethodFilter,Thymeleaf的th:method="delete"无法生效,请求无法匹配到删除接口 - 持久层删除方法缺少事务&修改注解:Spring Data JPA的自定义删除操作需要
@Modifying和@Transactional注解支撑,否则事务不会提交,数据不会被删除
修复步骤
1. 修改控制器方法修饰符和返回值
将所有请求处理方法改为public,删除方法执行完成后重定向到订单列表页:
@GetMapping("/orderListAdmin/decline") public String declineOrder(){ return "redirect:/orderListAdmin"; } @DeleteMapping("/orderListAdmin/decline") public String deleteOrder(@RequestParam("Id") long id){ orderService.deleteOrderById(id); // 操作完成后重定向到列表页刷新数据 return "redirect:/orderListAdmin"; } @GetMapping("/orderListAdmin") public String getOrderListAdmin(Model model) { model.addAttribute("masterorders",orderService.findAll()); return "orderListAdmin"; }
2. 开启DELETE请求支持
在项目配置文件中开启HiddenHttpMethodFilter:
如果是application.properties配置:
spring.mvc.hiddenmethod.filter.enabled=true
如果是application.yml配置:
spring: mvc: hiddenmethod: filter: enabled: true
3. 补充持久层/业务层注解
给OrderRepository的删除方法加上操作注解:
@Modifying @Transactional void deleteOrderById(long id);
更规范的写法是将@Transactional注解加在Service层的对应方法上:
@Transactional public void deleteOrderById(long id) { orderRepository.deleteOrderById(id); }
4. (可选优化)简化Thymeleaf属性写法
页面隐藏域的name属性可以直接用th:name,无需用th:attr:
<form action="/orderListAdmin/decline" th:method="delete" > <input type="hidden" th:value="${masterorder.id}" th:name="Id"/> <button type="submit" class="buttondecline" th:text="Decline"> </button> </form>
内容的提问来源于stack exchange,提问作者Jugjin
相关产品推荐
相关产品推荐

