当我尝试在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
答案 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。如果您有兴趣,请检查此内容。