Spring Boot指定获取lastevaluatedkey请求头却返回全部头部是为什么
问题原因
这是Spring MVC对@RequestHeader注解的默认处理规则导致的:
- 如果
@RequestHeader指定了单个请求头名称,但接收参数的类型为Map<String, ?>、MultiValueMap<String, ?>或HttpHeaders,Spring会直接忽略你指定的请求头名称,将全部请求头的键值对都注入到该Map参数中。
你的代码完全匹配这个场景:指定了要获取lastevaluatedkey请求头,但参数类型定义为Map<String,AttributeValue>,所以最终返回了全量请求头内容。
修复方案
请求头本身传输的是字符串格式,你携带的lastevaluatedkey是JSON结构的字符串,所以可以通过以下两种方案实现需求:
方案1:单独接收指定请求头再反序列化
// 先按字符串类型接收单个请求头 (@RequestHeader("lastevaluatedkey") String lastEvaluatedKeyJson) { // 使用JSON序列化工具(如Jackson、Gson)将字符串转为目标格式即可 ObjectMapper objectMapper = new ObjectMapper(); Map<String, AttributeValue> lastEvaluatedKey = objectMapper.readValue( lastEvaluatedKeyJson, new TypeReference<Map<String, AttributeValue>>() {} ); }
方案2:先接收全量请求头再提取目标值
// 不指定请求头名称,用Map接收所有请求头 (@RequestHeader Map<String, String> allHeaders) { String lastEvaluatedKeyJson = allHeaders.get("lastevaluatedkey"); // 后续同样做反序列化处理即可 }
内容的提问来源于stack exchange,提问作者Rajat Aggarwal
相关产品推荐
相关产品推荐

