Метод RestTemplate.exchange выдает ошибку, когда в ответе присутствуют символы «>» и «<"

#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 (не может быть обработана < > должным образом)