You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:54:02