2016-03-04 3 views
3

Я использую весной RestTemplate для связи с xml WebService бэкэндом следующим образом:Как использовать RestTemplate с несколькими типами ответов?

ResponseEntity<MainDTO> dto = restTemplate.postForObject(url, postData, MainDTO.class); 

Проблема: бэкенд может либо ответить MainDTO для нормальных данных или с ErrorDTO в случае сбоев. Но и с HTTP 200.

Но я не знаю, какой предмет вернется раньше! Anyways restTemplate требует, чтобы я прошел мимо class.

Итак, как я могу разобрать xml либо на нормальный, либо на компонент ошибки?

Sidenote: У меня нет контроля над брандмауэром webservice.

ответ

3

Как вы могли бы понять, проблема в том, что бэкенд должен вернуть вам ошибки с кодами ошибок HTTP, для чего они предназначены.

Но, как вы сказали, вы не имеете контроля над серверной, так что вы можете сделать, это сначала получить его в виде строки

ResponseEntity<String> dto = restTemplate.postForObject(url, postData, String.class); 

Затем вы можете попытаться разобрать строку ответа как MainDTO с либо Джексона или Гсона (что бы вы ни делали в своем проекте, что вам нужно, потому что я считаю, что Spring Restemplate Spring используется либо внутри, либо внутри) с помощью try/catch, и если он терпит неудачу, попробуйте проанализировать его с помощью вашего ErrorDto.

Update

О, я только что прочитал, что это был XML сервис, а не JSON на подход выше остается в силе, но вместо того, чтобы использовать Jackson или Gson, вы можете использовать SimpleXML (http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize) который позволяет вам десериализовать XML «простым» способом, вам просто нужно аннотировать ваши модели своими аннотациями, которые описаны в их учебниках и примеры.

Пример этой весны (http://spring.io/guides/gs/consuming-rest-xml-android/) также может дать представление о том, как использовать SimpleXML.

1

Вы можете реализовать пользовательский ResponseErrorHandler, который преобразует ошибочный ответ в RuntimeException. Http-сообщение для преобразования POJO может быть выполнено путем повторного использования messageConverter (s), используемый RestTemplate#setMessageConverters.

0

У меня такая же проблема, поэтому у меня есть абстрактный класс, описывающий ошибку. Все мои классы Json расширили абстрактный класс ошибок. Таким образом, объект ответа заполняется данными сущности и ошибкой, которую я мог бы легко проверить.

Мне не очень нравится это решение, но поскольку я немедленно трансформирую объект Json в объект данных приложения, он не чувствует себя слишком плохо.

0

ИспользованиеInstanceOf

MyObject1 a=null; 
MyObject2 b=null; 
ResponseEntity<Object>response=template.exchange(builder.build().encode().toUri(),HttpMethod.GET,entity, Object.class); 
if (response.getBody() instanceof MyObject1) 
    a= (MyObject1) response.getBody(); 
else if(response.getBody() instanceof MyObject2) 
    b= (MyObject2) response.getBody(); 
Смежные вопросы