Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring rest模板中的mime类型无效?_Java_Spring_Resttemplate_Spring Rest_Jackson2 - Fatal编程技术网

Java spring rest模板中的mime类型无效?

Java spring rest模板中的mime类型无效?,java,spring,resttemplate,spring-rest,jackson2,Java,Spring,Resttemplate,Spring Rest,Jackson2,我只是想做一个简单的休息请求,如下所示 String url = "some url"; MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); headers.add(HttpHeaders.AUTHORIZATION, "some author

我只是想做一个简单的休息请求,如下所示

String url = "some url";
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
headers.add(HttpHeaders.AUTHORIZATION, "some authorization");
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Body body = new Body();
body.setRemarks("test");
org.springframework.http.HttpEntity request = new org.springframework.http.HttpEntity(body, headers);
try {
    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, request, String.class);
    System.out.println("Status Response: "+ response.getStatusCode() +". Body: "+ response.getBody());
} catch (HttpClientErrorException | HttpServerErrorException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}
然而,当我通过邮递员尝试相同的请求时,它起作用了。我错过了一些非常简单的东西,我不知道是什么

我检查了邮递员和邮件头的回复,它们看起来像内容类型一样→应用程序/json;字符集=UTF-8,并且响应也是格式良好的


我也无法确定请求或响应是在哪个部分上,哪个Rest模板有问题。

在我的情况下,简短的回答是在发出请求之前添加这些额外的头

headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
headers.add(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.name());
详细回答:感谢使用调试器挖掘服务器上出现错误的建议,RestTemplate尝试从响应中收集所有标题和正文,以创建合理的异常消息。当尝试从响应创建该消息时,它得到了mime类型

text/plain, application/json, application/json, application/*+json, application/*+json, */*; charset=UTF-8
是的,是整个文本长度,而不是application/json;charset=UTF-8,如所示,用于相同的请求。因此,在我的例子中,一个较旧的SpringREST模板版本在尝试使用上面提供的mime类型时失败,生成了此消息

org.springframework.http.InvalidMediaTypeException: Invalid mime type "text/plain, application/json, application/json, application/*+json, application/*+json, */*; charset=UTF-8": Invalid token character ',' in token "plain, application/json, application/json, application/*+json, application/*+json, */*"
因此,一个更细粒度的mime类型异常从更深的堆栈中冒出来,而不是获取服务器错误,这对您正在搜索的内容毫无意义

根据RestTemplate,虽然我已经指定了Jackson到Http消息转换器,但最终还是使用了StringHttpMessageConverter,如下所示

restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
正如前面提到的,拥有StringHttpMessageConverter会导致writeAcceptCharset为true,这带来了mime类型的长格式和几乎所有可能的值。在上面提到的文章中,解决方案是要么将writeAcceptCharset设置为false,要么不编写普通字符串,而是使用object,然后将其封送为字符串


对于我的用例,我希望响应类型为application/json,字符集为UTF-8,所以在配置中设置这些accept头解决了我的问题。

在我的例子中,简短的回答是在发出请求之前添加这些额外的头

headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
headers.add(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.name());
详细回答:感谢使用调试器挖掘服务器上出现错误的建议,RestTemplate尝试从响应中收集所有标题和正文,以创建合理的异常消息。当尝试从响应创建该消息时,它得到了mime类型

text/plain, application/json, application/json, application/*+json, application/*+json, */*; charset=UTF-8
是的,是整个文本长度,而不是application/json;charset=UTF-8,如所示,用于相同的请求。因此,在我的例子中,一个较旧的SpringREST模板版本在尝试使用上面提供的mime类型时失败,生成了此消息

org.springframework.http.InvalidMediaTypeException: Invalid mime type "text/plain, application/json, application/json, application/*+json, application/*+json, */*; charset=UTF-8": Invalid token character ',' in token "plain, application/json, application/json, application/*+json, application/*+json, */*"
因此,一个更细粒度的mime类型异常从更深的堆栈中冒出来,而不是获取服务器错误,这对您正在搜索的内容毫无意义

根据RestTemplate,虽然我已经指定了Jackson到Http消息转换器,但最终还是使用了StringHttpMessageConverter,如下所示

restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
正如前面提到的,拥有StringHttpMessageConverter会导致writeAcceptCharset为true,这带来了mime类型的长格式和几乎所有可能的值。在上面提到的文章中,解决方案是要么将writeAcceptCharset设置为false,要么不编写普通字符串,而是使用object,然后将其封送为字符串


对于我的用例,我希望响应类型为application/json,字符集为UTF-8,因此在配置中设置这些accept头解决了我的问题。

尝试将jackson converter放在第一个位置restTemplate.getMessageConverters.add0,新的MappingJackson2HttpMessageConverter;。如果没有帮助,那么我建议您使用调试器并深入RestTemplate。给我们一个完整的restController代码。@SubinCPoonamgode我没有控制器代码,这是我试图使用的REST客户端API,由他们的团队构建。我能够成功地与邮递员联系。尝试将jackson converter放在第一个位置restTemplate.getMessageConverters.add0,new MappingJackson2HttpMessageConverter;。如果没有帮助,那么我建议您使用调试器并深入RestTemplate。给我们一个完整的restController代码。@SubinCPoonamgode我没有控制器代码,这是我试图使用的REST客户端API,由他们的团队构建。我能和邮递员成功地联系上。