Хорошо, у меня есть класс NamedSystems, который имеет в качестве единственного поля набор NamedSystem.
У меня есть способ найти NamedSystems по определенным критериям.Это не очень важно.Когда он дает результаты, все работает отлично.Однако, когда он ничего не может найти и, таким образом, возвращает нулевой (или пустой - я пробовал оба пути) набор, у меня возникают проблемы.Позвольте мне объяснить.
Я использую класс Spring RestTemplate и выполняю такой вызов в модульном тесте:
ResponseEntity<?> responseEntity = template.exchange(BASE_SERVICE_URL + "?
alias={aliasValue}&aliasAuthority={aliasAssigningAuthority}",
HttpMethod.GET, makeHttpEntity("xml"), NamedSystems.class,
alias1.getAlias(), alias1.getAuthority());
Теперь, так как это обычно возвращает 200, но я хочу вернуть 204, у меня есть перехватчик в моей службе, который определяет, является ли ModelAndView NamedSystem и имеет ли его набор значение NULL.Если это так, то я устанавливаю код состояния в NO_CONTENT (204).
Когда я запускаю свой тест junit, я получаю эту ошибку:
org.springframework.web.client.RestClientException: Cannot extract response: no Content-Type found
Установка статуса NO_CONTENT, кажется, стирает поле типа контента (что имеет смысл, когда я думаю об этом).Так почему же он даже смотрит на это?
Метод SpringD HttpMessageConverterExtractor extractData:
public T extractData(ClientHttpResponse response) throws IOException {
MediaType contentType = response.getHeaders().getContentType();
if (contentType == null) {
throw new RestClientException("Cannot extract response: no Content-Type found");
}
for (HttpMessageConverter messageConverter : messageConverters) {
if (messageConverter.canRead(responseType, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + responseType.getName() + "] as \"" + contentType
+"\" using [" + messageConverter + "]");
}
return (T) messageConverter.read(this.responseType, response);
}
}
throw new RestClientException(
"Could not extract response: no suitable HttpMessageConverter found for response type [" +
this.responseType.getName() + "] and content type [" + contentType + "]");
}
Немного поднимаясь по цепочке, чтобы выяснить, где установлен этот Extractor, я прихожу на обмен RestTemplate) метод, который я использовал в тесте:
public <T> ResponseEntity<T> exchange(String url, HttpMethod method,
HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException {
HttpEntityRequestCallback requestCallback = new HttpEntityRequestCallback(requestEntity, responseType);
ResponseEntityResponseExtractor<T> responseExtractor = new ResponseEntityResponseExtractor<T>(responseType);
return execute(url, method, requestCallback, responseExtractor, uriVariables);
}
Итак, он пытается преобразовать то, что ничего не значит, из-за предоставленного типа ответа от вызова обмена.Если я изменю responseType с NamedSystems.class на null, он будет работать как положено.Он не пытается ничего конвертировать.Если бы я попытался установить код состояния на 404, он также работает нормально.
Я ошибся или это похоже на недостаток RestTemplate?Конечно, я сейчас использую junit, поэтому я знаю, что произойдет, но если кто-то использует RestTemplate для вызова этого и не знает результат вызова службы, он, естественно, будет иметь NamedSystems в качестве типа ответа.Однако, если бы они попытались выполнить поиск по критерию, в котором не было элементов, у них возникла бы эта неприятная ошибка.
Есть ли способ обойти это без переопределения какого-либо материала RestTemplate?Я неправильно рассматриваю эту ситуацию?Пожалуйста, помогите, поскольку я немного сбит с толку.