Поведение Spring RestTemplate при обработке ответов с состоянием NO_CONTENT

Хорошо, у меня есть класс 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 и если его множество является пустым. Если так, я затем набор код состояния к NO_CONTENT (204).

Когда я запускаю свой junit тест, я получаю эту ошибку:

org.springframework.web.client.RestClientException: Cannot extract response: no Content-Type found

Установка состояния к NO_CONTENT, кажется, вытирает поле типа контента (который действительно имеет смысл, когда я думаю об этом). Итак, почему это даже смотрит на него?

Метод HttpMessageConverterExtractor extractData Spring:

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 + "]");
}

Поднимаясь цепочка немного для обнаружения, где тот Экстрактор установлен я прихожу к обмену 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 до пустого указателя, он работает как ожидалось. Это не пытается преобразовать что-либо. Если я попытался установить код состояния на 404, он также выполняется прекрасный.

Я дезинформирован, или это походит на дефект в RestTemplate? Несомненно, я использую junit прямо сейчас, таким образом, я знаю то, что собирается произойти, но если бы кто-то использует RestTemplate для вызова этого и не знает результата служебного вызова, у них естественно был бы NamedSystems как тип ответа. Однако, если бы они попробовали поиск критериев, который подошел без элементов, то у них была бы эта противная ошибка.

Существует ли путь вокруг этого, не переопределяя материала RestTemplate? Я просматриваю эту ситуацию неправильно? Помогите, поскольку я немного экранирован.

18
задан Walery Strauch 15 December 2014 в 12:54
поделиться