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

Spring Boot如何将请求头直接映射到DTO?

解决Spring Boot请求头映射到DTO的问题

你遇到的问题是因为直接给DTO参数加@RequestHeader时,Spring会默认寻找名为userInfo的请求头,但你实际需要的是把多个请求头(比如userId、name)映射到DTO的字段上,所以才会抛出缺失请求头的异常。

下面给你两种实用的解决方法:

方法一:在DTO字段上标注@RequestHeader

直接在DTO的每个字段上用@RequestHeader指定对应的请求头名称,然后控制器方法里直接传入DTO即可,无需额外注解:

data class UserHeaderDto(
    @RequestHeader("userId") val userId: Long,
    @RequestHeader("name") val name: String
)

控制器方法修改为:

@PostMapping("blah")
suspend fun blah(userInfo: UserHeaderDto) {}

Spring会自动将请求头中对应名称的值绑定到DTO的字段上,和@ModelAttribute处理查询参数的逻辑类似。

方法二:使用无属性的@RequestHeader(字段名与请求头名一致时)

如果你的DTO字段名和请求头名称完全一致(比如请求头就是userId和name),可以不用在DTO字段上加注解,直接在控制器方法的DTO参数上添加不带属性的@RequestHeader:

@PostMapping("blah")
suspend fun blah(@RequestHeader userInfo: UserHeaderDto) {}

这种情况下,Spring会自动遍历请求头,将与DTO字段名匹配的请求头值绑定到对应字段。注意如果请求头名称和字段名不一致,还是需要用方法一的方式指定。

为什么原代码报错

原代码中@RequestHeader userInfo: UserHeaderDto的写法,Spring会将userInfo当作请求头的名称,尝试获取这个请求头的值并转换为UserHeaderDto类型,但你的请求里并没有名为userInfo的请求头,所以抛出MissingRequestHeaderException。

内容的提问来源于stack exchange,提问作者Teodoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:23:19