• RestTemplate 返回值设置MediaType时的问题


    这是client端的请求

            RestTemplate restTemplate = new RestTemplate();
            String url = "http://localhost:8902/tttt234";
    
            try {
                ResponseEntity res = restTemplate.exchange(url, HttpMethod.POST, null, JSONObject.class);
                JSONObject json = res.getBody();
                System.out.println(json);
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    这是Server端的方法

    
        @PostMapping(value = "/tttt234")
        private ResponseEntity xxxxx() {
    
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("name", "123");
            jsonObject.put("data", "{}");
        //  return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(jsonObject);
            return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(jsonObject.toString());
        }
    

    client端就会报错

    org.springframework.web.client.RestClientException: Error while extracting response for type [class com.alibaba.fastjson.JSONObject] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `int` from String "{"data":"{}","name":"123"}": not a valid `int` value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `int` from String "{"data":"{}","name":"123"}": not a valid `int` value
     at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 1]
    
    

    如果server端在最后的返回的地方不使用toString方法,client端就不会报错,这是什么原理?

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-20 23:15
      关注

      引自免费微信小程序:皆我百晓生

      这个问题是关于Spring框架的RestTemplate客户端在处理服务器返回的JSON数据时遇到的问题。从错误信息来看,问题的关键在于服务器返回的数据格式和客户端期望的数据格式不一致。让我来分析一下:

      当服务器使用 jsonObject.toString() 方法返回数据时,返回的是一个字符串形式的JSON对象,其格式大致为 {"data":"{}","name":"123"}。这个字符串被客户端的RestTemplate接收后,尝试将其解析为 JSONObject 类型。在这个过程中,如果JSON字符串中的某个字段值被解析为预期的数据类型失败(比如这里尝试将一个字符串解析为整数),就会抛出异常。因此,你遇到的错误是由于服务器返回的JSON字符串中包含的某个字段值无法被解析为预期的整数类型导致的。

      然而,当服务器不使用 toString() 方法时,它直接返回 jsonObject 对象。在这种情况下,服务器返回的实际上是一个序列化的JSON字节流,而不是一个字符串。客户端在接收这个字节流后,能够正确地将其解析为 JSONObject 类型,因此不会报错。

      为了解决这个问题,你可以确保服务器返回的JSON数据格式与客户端期望的格式一致。具体来说,你需要检查并确保服务器返回的JSON数据中不存在无法正确解析为预期数据类型的字段值。如果某些字段的值是字符串形式的数字,你需要确保客户端在解析这些值时能够正确处理。你也可以考虑在客户端使用更灵活的JSON解析库(如Jackson或Gson),这些库通常能更好地处理各种数据格式。

      总结一下,这个问题的根源在于服务器返回的JSON数据格式与客户端期望的格式不一致。你需要确保两者之间的数据格式一致,以避免类似的问题发生。

    • 阿里嘎多学长 2024-06-20 23:15
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      这个问题涉及到Spring框架中的RestTemplate客户端和服务器端的交互,以及JSON数据的序列化和反序列化。首先,我们来分析一下问题的原因。

      问题原因分析

      1. 客户端期望类型:客户端期望的响应体类型是JSONObject,这是一个Java对象,用于表示JSON数据。

      2. 服务器端响应:服务器端返回的是一个JSONObject对象,但是使用了jsonObject.toString()将其转换为了一个JSON格式的字符串。

      3. MediaType设置:服务器端设置了MediaType.APPLICATION_JSON,这告诉客户端响应体是JSON格式的数据。

      4. 客户端解析错误:当使用jsonObject.toString()时,客户端尝试将这个JSON字符串反序列化为JSONObject对象。但是,由于某种原因(可能是客户端内部的反序列化机制或者JSON格式的问题),解析过程中出现了类型不匹配的错误。

      解决方法

      • 不使用toString:如果不使用toString,服务器端直接返回JSONObject对象,客户端接收到的是一个可以直接反序列化为JSONObject的对象,而不是一个JSON字符串,这样就避免了字符串解析的问题。

      • 检查JSON格式:确保服务器端返回的JSON字符串格式正确,没有多余的空格或不可见字符,这些可能会导致解析错误。

      • 自定义HttpMessageConverter:如果需要返回JSON字符串,可以自定义一个HttpMessageConverter来处理JSON字符串到JSONObject的转换。

      • 使用Jackson或Gson:在Spring Boot中,通常使用Jackson或Gson来处理JSON数据的序列化和反序列化。确保你的项目中包含了这些库,并且在RestTemplate中正确配置了它们。

      参考链接

      总结

      使用toString方法将JSONObject转换为字符串可能会导致客户端解析错误,因为客户端期望的是一个可以直接反序列化为JSONObject的对象。避免使用toString,或者确保JSON格式正确,以及使用合适的库来处理JSON数据,可以解决这个问题。

      展开全部

    • 流华追梦 2024-06-21 08:06
      关注

      问题的关键在于服务器返回的数据格式和客户端期望的数据格式不一致。

  • 相关阅读:
    java-php-python-ssm智慧后勤系统计算机毕业设计
    pytorch+LSTM实现使用单参数预测,以及多参数预测(代码注释版)
    初级算法_排序和搜索 --- 合并两个有序数组
    增删卜易——八宫六十四卦
    tasklet的实现(原理篇)
    Elasticsearch:运用 Python 实时通过 Logstash 写入日志到 Elasticsearch
    Python 正则表达式:强大的文本处理工具
    PMP每日一练 | 考试不迷路-7.6
    如何通过数据治理来提升业务价值——业务场景治理
    Redis中的SDS理解
  • 原文地址:https://ask.csdn.net/questions/8121973