我刚遇到这个问题而无法理解为什么会这样。
客户端片段:
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太长了,对不起......
答案 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());