从 @RequestHeader 读取 JSON 对象

cae*_*001 6 java spring-boot

我正在接收一个 JSON 对象,该对象是从前端作为字符串发送给我的,我希望 spring-boot 将其解析为我的 Map 。

我尝试过 @RequestHeader("header-name") Map 标头和 @RequestHeader Map 标头,但两者都为我提供了所有标头的映射,而不是我的目标包含 JSON 的标头。

public ResponseEntity<MyObject> getStuff(@RequestHeader("My-Header") Map myHeaderJSON)
Run Code Online (Sandbox Code Playgroud)

我希望 Spring 将变量 myHeaderJSON 字符串解析为 Map。有什么办法可以实现这一点吗?让 spring-boot 帮我将字符串解析为 JSON 或 Map?

Tom*_*der 3

如果您希望 Spring 将单个 http 请求标头“注入”到您的控制器方法(作为参数)中,请尝试以下方法:

@RequestMapping("/your-path")
public ResponseEntity<MyObject> getStuff(@RequestHeader("My-Header") String jsonValue) {
   //...
}
Run Code Online (Sandbox Code Playgroud)

另请参阅此处:https: //www.viralpatel.net/spring-requestheader-example/

您还可以尝试实现自定义转换器,请参阅此处的示例:

/sf/answers/3569744461/

解决方法是使用ObjectMapperJackson 库中的实例将 JSON 字符串转换为对象java.util.Map......

可以这样工作(虽然没有测试):

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class JsonToMapConverter implements Converter<String, Map<String,String>> {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Map<String, String> convert(final String json) {
        try {
           return objectMapper.readValue(json, Map.class);
        } catch (IOException e) {
           //handle exception...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将 Jackson 添加到您的依赖项中,例如在 Maven 中:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)