2

当我尝试在 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

响应头包括: Content-Encoding: gzip Content-Type: application/json

我不知道它是否与编码为gzip有关

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

4

2 回答 2

0

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

于 2013-10-23T12:49:34.473 回答
0

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

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

或者您可以添加 Custom Deserializer 或 Mixin 注解,以避免在任何地方分层添加默认构造函数。如此处所述:http: //blogs.jbisht.com/blogs/2016/09/12/Deserialize-json-with-Java-parameterized-constructor。如果您有兴趣,请检查此。

于 2018-07-18T08:50:23.770 回答