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

Spring中PostMapping接口如何获取其他路由的表单提交数据?

解决API控制器无法获取表单数据的问题

问题背景

你的ListingRestController通过@PostMapping("/listings/edit/{id}")接收/api/listings/edit/{id}路径的POST请求,但由于表单定义在/listings/edit/{id}路由下,导致控制器方法无法正确获取ListingForm的表单数据。控制器代码如下:

@RestController
@RequestMapping("api")
public class ListingRestController {
    @PostMapping("/listings/edit/{id}")
    public void editListing(ListingForm newListing, @PathVariable Integer id, Model model) {
        ListingDto newListingDto = new ListingDto(newListing.getId(), newListing.getUserId(), newListing.getTitle());
        model.addAttribute("submitURL", String.format("edit/%s", id));
        listingService.deleteListingById(id);
        listingService.addListing(newListingDto);
    }
}

解决方案

1. 修正表单提交路径

表单的action属性必须指向API的完整绝对路径/api/listings/edit/{id}。如果使用相对路径,会基于当前页面路由/listings/edit/{id}拼接出错误的请求地址。比如在Thymeleaf模板中,表单应这样配置:

<form th:action="@{/api/listings/edit/{id}(id=${listing.id})}" method="post">
    <!-- 表单字段 -->
</form>

2. 给表单参数添加绑定注解

Spring MVC需要明确注解来完成请求参数到对象的绑定:

  • 传统表单提交(application/x-www-form-urlencoded类型):给ListingForm参数添加@ModelAttribute注解;
  • AJAX JSON提交:添加@RequestBody注解,同时确保请求头Content-Type设置为application/json。

3. 移除无用的Model参数

@RestController用于返回响应体而非视图页面,Model在这里没有实际作用,建议直接移除。

修改后的控制器代码

传统表单提交场景

@RestController
@RequestMapping("api")
public class ListingRestController {
    @PostMapping("/listings/edit/{id}")
    public void editListing(@ModelAttribute ListingForm newListing, @PathVariable Integer id) {
        ListingDto newListingDto = new ListingDto(newListing.getId(), newListing.getUserId(), newListing.getTitle());
        listingService.deleteListingById(id);
        listingService.addListing(newListingDto);
    }
}

JSON提交场景

@RestController
@RequestMapping("api")
public class ListingRestController {
    @PostMapping("/listings/edit/{id}")
    public void editListing(@RequestBody ListingForm newListing, @PathVariable Integer id) {
        ListingDto newListingDto = new ListingDto(newListing.getId(), newListing.getUserId(), newListing.getTitle());
        listingService.deleteListingById(id);
        listingService.addListing(newListingDto);
    }
}

内容的提问来源于stack exchange,提问作者one-hand-octopus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:10:27