Метод restTemplate.exchange выдает ошибку, когда в ответе присутствуют символы «>» и «<». - PullRequest
0 голосов
/ 03 апреля 2019

Я пишу функцию для запросов POST к нескольким API REST.

Вот код, который я придумал.

@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(). Но я хочу знать, почему выбрасывается эта ошибка.

...