【问题标题】:Spring HttpMessageNotReadableExceptionSpring HttpMessageNotReadableException
【发布时间】:2013-11-01 17:46:26
【问题描述】:

当我尝试在 java 中使用 spring 时,我得到了一个 HttpMessageNotReadableException。 打印的 Stacktrace 说:

嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException:无法读取 JSON:非法字符((CTRL-CHAR,代码 31)):只允许常规空格(\r、\n、\t)标记之间

这与我获取的方式有关,还是与我的回复格式有关?

我的称呼是:

    HttpEntity<JSONObject> entity = new HttpEntity<JSONObject>();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("Accept", "application/x-gzip");
    headers.set("charset", "UTF-8");
    return getConnector().exchange(url, HttpMethod.GET, entity, JSONObject.class);

getConnector() 返回一个 RestConnector

响应标头包括: 内容编码:gzip 内容类型:application/json

不知道是不是和gzip的编码有关

编辑: 问题是内容编码是gzip..最后,我使用了支持gzip编码的HttpClient

【问题讨论】:

    标签: java spring


    【解决方案1】:

    这很可能是由您的回复引起的。 如果是常规(静态)文件或手动构建,请检查是否存在非法空白。

    【讨论】:

      【解决方案2】:

      在我的例子中,sprint mvc w/jackson (jackson-mapper-asl, v-1.9.10) 反序列化需要 JSON 解析器。而且jackson需要一个默认构造函数来进行http请求消息的反序列化,如果没有默认构造函数,jackson会出现反射问题并抛出HttpMessageNotReadableException异常。

      也就是说,所有用作请求体的类/子类,都需要一个默认构造函数。在我尝试添加自定义转换器和我在 stackoverflow 中得到的其他建议徒劳后,这让我付出了一些时间。

      或者您可以添加自定义反序列化器或 Mixin 注释以避免在任何地方分层添加默认构造函数。如此处所述:http://blogs.jbisht.com/blogs/2016/09/12/Deserialize-json-with-Java-parameterized-constructor。如果您有兴趣,请查看这里。

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 2017-05-24
        • 2016-04-25
        • 2015-06-22
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        相关资源
        最近更新 更多