Именно поэтому я предпочитаю иметь полный контроль над отображением XML на объект, чтобы я мог отделить модель от интерфейса XML. В вашем случае я просто добавил бы новые поля в TradeDetail и посчитал бы их «необязательными» для обратной совместимости. Это будет пример XML-> Object mapping для TradeDetail в среде, используемой моей командой, написанной для вашего интерфейса:
// this would go into my client endpoint class
public TradeDetail getTradeDetail() {
Element requestRoot = new Element("GetTradeDetail");
Element responseRoot = invokeWebServiceAndReturnJdomElement(requestRoot);
return mapTradeDetail(responseRoot);
}
// this would go into my client XO mapping class
public TradeDetail mapTradeDetail(Element root) {
TradeDetail tradeDetail = new TradeDetail();
tradeDetail.setField1 = fetchString(root, "/GetTradeDetail/Field1");
tradeDetail.setField2 = fetchInteger(root, "/GetTradeDetail/Field2");
tradeDetail.setField3 = mapField3(root, "/GetTradeDetail/Field3");
tradeDetail.setField4 = fetchString(root, "/GetTradeDetail/Field4");
}
Этот тип клиента будет игнорировать новые поля, поэтому будет совместим с новой версией протокола, пока я не добавлю что-то подобное в конец этого же метода в версии 2:
if (fetchXPath(root, "/GetTradeDetail/Field5") != null) {
// so we're talking with server which speaks new version of protocol
tradeDetail.setField5 = fetchString(root, "/GetTradeDetail/Field5");
}
Сервер будет работать с аналогичным кодом, возможно, проверяя версию клиента и отображая дополнительные поля, только если клиент поддерживает новую версию протокола.
На мой взгляд, клиент должен быть написан так, чтобы несколько дополнительных полей, добавленных к протоколу, не сломали клиента - я не могу позволить себе потерять его просто потому, что вышестоящий провайдер добавил новые функции и не сообщил мне о Это. Если поставщик изменяет существующие обязательные поля, конечно, клиент нуждается в модификации. Вот почему вышестоящий провайдер должен версия протокола и поддерживать старую версию в течение как минимум нескольких месяцев.