Spring HttpMessageNotReadableException

时间:2013-10-23 12:35:38

标签: java spring

当我尝试在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         Content-Type:application / json

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

有关

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

就我而言,作为带有sackson的sprint mvc(jackson-mapper-asl,v-1.9.10),反序列化需要JSON解析器。杰克逊需要为HTTP请求消息反序列化使用默认构造函数,如果没有默认构造函数,杰克逊将遇到反射问题并抛出HttpMessageNotReadableException异常。

这就是说,用作请求正文的所有类/子类都需要默认构造函数。在尝试添加自定义转换器和其他徒劳的stackoverflow建议之后,这花了我几分钟的时间。

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