【问题标题】:Reading JSON Object from @RequestHeader从 @RequestHeader 读取 JSON 对象
【发布时间】:2019-10-29 23:34:46
【问题描述】:

我正在接收一个 JSON 对象,它作为一个字符串从前端传给我,我希望 spring-boot 为我将它解析为一个 Map。

我已经尝试过 @RequestHeader("header-name") 映射头和 @RequestHeader 映射头,但它们都给了我所有头的映射,而不是包含 JSON 的我的目标。

public ResponseEntity<MyObject> getStuff(@RequestHeader("My-Header") Map myHeaderJSON)

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

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    不,您需要自己反序列化。

    来自spring docs

    如果方法参数是Map&lt;String, String&gt;MultiValueMap&lt;String, String&gt;HttpHeaders,则映射将填充所有标头名称和值。

    它不会从地图中提取和反序列化 json,而是您需要执行以下操作:

    public ResponseEntity<MyObject> getStuff(@RequestHeader Map myHeader) { 
        String json = myHeader.get("My-Header");
        MyClass myClass = objectMapper.readValue(json, MyClass.class);
    
        ... 
    }
    
    

    【讨论】:

    • 谢谢。我最终这样做了!
    【解决方案2】:

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

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

    也可以在这里查看:https://www.viralpatel.net/spring-requestheader-example/

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

    https://stackoverflow.com/a/50996349/150623

    要走的路是使用 Jackson 库中的 ObjectMapper 实例将 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...
            }
        }
    }
    

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

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>
    

    【讨论】:

    • 有什么方法可以避免使用字符串并直接进入地图?
    猜你喜欢
    • 2013-03-06
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2018-01-24
    • 2018-11-17
    • 2012-04-19
    相关资源
    最近更新 更多