Что, если веб-сервис XML
может отвечать разными XML-структурами? Например, <OkResponse>
и <ErrorResponse>
с совершенно разными полями?
ResponseEntity<Response> rsp = restTemplate
.postForEntity(url, new HttpEntity<>(xml, HEADERS), OkResponse.class);
Перед отправкой запроса я не знаю, какой тип ответа вернется. Если я использую OkResponse.class
, я получу ClassCastException
, если будет возвращено ErrorResponse
.
Как я мог справиться с этим?
Автогенерируемые bean-компоненты выглядят следующим образом:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({
OkResponse.class,
ErrorResponse.class
})
public class AbstractResponse {
}
ErrorResponse
будет возвращено только в случае ошибки. Это должно означать, что сервер возвращает код состояния 4xx или 5xx, и вы получаете исключение. Что в свою очередь означает, что вопрос спорный. В любом другом случае что-то не так и вопрос тоже спорный. - person a better oliver   schedule 10.01.2017AbstractResponse.class
вместоOkResponse.class
, десериализатор должен иметь возможность создавать экземпляр с правильным типом, и вы можете использоватьinstanceof
для обработки обоих случаев. - person a better oliver   schedule 10.01.2017spring
, который я использую. Я мог бы опубликовать объект какResponseEntity<AbstractResponse>
, но тогда я не могу привести ответ кResponseEntity<OkResponse>
, поскольку java запрещает такой тип приведения. Также я не могу вызвать(OkResponse) rsp.getBody()
, так как чтение тела заставит возвращаемый тип всегда бытьAbstractResponse
, и, таким образом, ответ здесь никогда не будетinstanceof OkResponse
. - person membersound   schedule 10.01.2017