2016-06-02 9 views
1

Вызов Rest WebService с помощью шаблона Spring Rest следующим образом-Демаршаллизация ответ в зависимости от HTTP кода во время весенних услуг Rest называют

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

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

<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, тогда ответ не относится к типу, а относится к типу infoException.

Можем ли мы указывать на resttemplate, чтобы развязать выход в зависимости от кода ответа Http?

+0

Xml Элементы не соответствует тип Pojo. Пример: - должен иметь POJO, как private String FirstName не private String firstName; – Pavan

+0

http://pojo.sodhanalibrary.com/ – Pavan

ответ

2

Остальной шаблон проверяет ответ на ошибку перед извлечением данных. Таким образом, одним из способов было бы создать шаблон отдыха с реализацией 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; 
     } 
+0

Спасибо Shiv. Этот подход хорош. – Rehan

0

Его 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 
} 
+1

Спасибо, что указали, что из павана. Исправлено. Мое разборчивость работает хорошо. То, что я хочу сделать, является немаршальным для определенного класса в зависимости от Httpcode ответа. Если Http-код 200 не является стандартным для информационного класса. если 500, то unmarhal его для infoexception класс – Rehan

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^