#java #spring #http #resttemplate
#java #весна #http #resttemplate
Вопрос:
Я пишу функцию для ОТПРАВКИ запросов нескольким REST API.
Вот код, который я придумал.
@Autowired
@Qualifier("restTemplate")
RestTemplate restTemplate;
public String post(String lambdaApiBasicUri, String pathPostfix, String reqBody) throws Exception {
HttpEntity<String> requestEntity = new HttpEntity<String>(reqBody, createHeaders());
ResponseEntity<String> responseEntity = restTemplate.exchange(
createReqUrl(lambdaApiBasicUri, pathPostfix),
HttpMethod.POST,
requestEntity,
String.class);
return responseEntity.getBody();
}
Это отлично работает во всех случаях, за исключением случаев, когда одно конкретное сообщение об ошибке от API содержит символы <
и >
в теле. В этом случае это выдает мне следующую ошибку:
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://example.com/abc": Attempted read from closed stream.; nested exception is java.io.IOException: Attempted read from closed stream.
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:673)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:538)
Из поиска в Google я узнал, что это исключение возникает, когда мы пытаемся «использовать» ответ более одного раза. Но проблема в том, что я даже не добираюсь до той части, где вызывается responseEntity.getBody();
. Ошибка возникает при самом вызове RestTemplate.exchange().
Я смог решить проблему, объединив resttempalte.execute()
вызов вместо restTemplate.exchange()
. Но я хочу знать, почему возникает эта ошибка.
Комментарии:
1. Какую версию Spring вы используете? Возможно, попробуйте использовать последнюю версию, чтобы проверить, разрешилась ли она. Потому что проблема, которую вы описали, звучит как ошибка
RestTemplate
(не может быть обработана< >
должным образом)