使用httpMethod.POST在restTemplate.exchange之后调用时,为什么HttpStatusCodeException.getResponseBodyAsString()为空

时间:2015-10-20 08:55:19

标签: java spring

我刚遇到这个问题而无法理解为什么会这样。

客户端片段:

try {
    ResponseEntity<Credentials> response = this.restTemplate.exchange(uri, HttpMethod.POST, httpEntity,
                    Credentials.class);
    this.userCredentials = response.getBody();
    return this.userCredentials;
} catch (HttpStatusCodeException hsce) {
    logger.error("loginUser failed with code " + hsce.getMessage());
    ObjectMapper mapper = new ObjectMapper();
    TransmissionFailureException tfe = new TransmissionFailureException();
    try {
    if (hsce.getStatusCode() == HttpStatus.UNAUTHORIZED) {
        logger.warn(" HIER " + hsce.getMessage());
        throw (CredentialsIncorrectException) mapper.readValue(hsce.getResponseBodyAsString(), CredentialsIncorrectException.class);
...

当我将HttpMethod设置为GET(当然也在服务器端)时,hsce.getResponseBodyAsString()将错误的JSON表示形式返回为String,并且Parsing / Mapping按预期工作。

完全相同的Request执行的奇怪的事情SoapUI在POST和GET中按预期在正文中携带异常。

我在这里弄错了还是某种错误?

任何帮助将不胜感激。

亲切的问候

编辑: Soap UI使用GET显示的Json Body:

{
"cause": null,
"stackTrace":    [
...
],
"localizedMessage": "No user found with given username...",
"message": "No user found with given username...",
"suppressed": []
}

Soap UI使用POST显示的Json Body:

{
"cause": null,
"stackTrace":    [
        ...
],
"localizedMessage": "No user found with given username...",
"message": "No user found with given username...",
"suppressed": []
}

StackTrace太长了,对不起......

1 个答案:

答案 0 :(得分:7)

我知道它发生的原因。正如我从文档中看到的那样

  

&#34;注意:默认情况下,RestTemplate依赖于标准的JDK工具来建立HTTP连接。您可以通过HttpAccessor.setRequestFactory(org.springframework.http.client.ClientHttpRequestFactory)属性切换到使用不同的HTTP库,例如Apache HttpComponents,Netty和OkHttp。&#34;

并查看他们的doc和警告:

  

请注意,HTTP请求的java.net实现可能会引发   访问表示响应的响应状态时的异常   错误(例如401)。如果这是一个问题,请切换到   改为HttpComponentsClientHttpRequestFactory。

如果状态代码为401(未经授权),则java.net impl引发异常。

要将响应正文作为字符串,只需将请求工厂更改为RestTemplate

    RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());

    template.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

使用apache http组件。请参阅链接herehere