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
相关产品推荐
相关产品推荐

