Непостоянный ответ в зависимости от HTTP-кода во время вызова Spring Rest Service

Вызов веб-сервиса Rest с использованием Spring Rest Template следующим образом:

ResponseEntity<String> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, entity, String.class); 

и получить вывод в формате String как

<Info xmlns="http://schemas.test.org/2009/09/Tests.new" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>FirstName</FirstName>
<LastName>LastName</LastName>
<TestGuid>Guid</TestGuid>
<TestUID>1</TestUID>
<Token>token</Token>
<TestUserID>14</TestUserID>
</Info>

При попытке демонтировать его в Java-класс следующим образом

ResponseEntity<Info> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, entity, Info.class)

Класс Info определяется как

@XmlRootElement(name = "Info", namespace = "http://schemas.test.org/2009/09/Tests.new")
public class Info implements Serializable{

    private String FirstName;
    private String LastName;
    private String TestGuid;
    private String TestUID;
    private String Token;
    private String TestUserID;

    //getters and setter

}   

Если http-код ответа равен 500, то ответ относится не к типу info, а к другому типу infoException.

Можем ли мы указать для шаблона повторной сортировки вывод в зависимости от кода ответа Http?

3 ответа

Решение

Остальной шаблон проверяет ответ на ошибку перед извлечением данных. Таким образом, одним из способов было бы создать шаблон Rest с реализацией ResponseErrorHandler и переопределить метод handleError, чтобы извлечь ответ об ошибке для вашего объекта с помощью конвертеров, а затем превратить этот объект ошибки в исключение. Что-то вроде этого.

    class ErrorObjectResponseHandler implements ResponseErrorHandler {

      private List<HttpMessageConverter<?>> messageConverters;

      @Override
      public boolean hasError(ClientHttpResponse response) throws IOException {
        return hasError(response.getStatusCode());
      }

      protected boolean hasError(HttpStatus statusCode) {
        return (statusCode.is4xxClientError() || statusCode.is5xxServerError());
      }

      @Override
      public void handleError(ClientHttpResponse response) throws IOException {
        HttpMessageConverterExtractor<Error> errorMessageExtractor =
          new HttpMessageConverterExtractor(Error.class, messageConverters);
        Error errorObject = errorMessageExtractor.extractData(response);
        throw new SomeException(errorObject);
      }

      public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        this.messageConverters = messageConverters;
      }

Весна 5 предложений ExtractingResponseErrorHandler специально для этого

Его XML в POJO не может быть десериализован из-за преобразования из XML в класс. Попробуйте использовать этот POJO.

public class Info implements Serializable{

    private String TestGuid;

    private String TestUID;

    private String FirstName;

    private String xmlns;

    private String Token;

    private String LastName;

    private String TestUserID;

    //getters and setter
}
Другие вопросы по тегам