2009-02-02 2 views
3

У меня есть службы SOAP, который предоставляет методДобавление полей в WebService

TradeDetail getTradeDetail() 

TradeDetail магазины 5 полей, номер транзакции, даты и т.д.

мне нужно добавить пару полей TradeDetail. Я хочу, чтобы сохранить обратную совместимость (на некоторое время), и это выглядит, как если бы мои возможности ограничены создание нового класса с дополнительными полями

TradeDetail2 getTradeDetail2() 

Теперь это будет работать - я делал это раньше. Но есть ли другие решения, которые люди использовали?

E.g.

  • В принципе измените TradeDetail2, чтобы добавить пары значений имени.
  • Наследование TradeDetail2 из TradeDetail, это приведет к сокращению кода, но увеличить сцепления
  • Return XML или JSON вместо

я смогу выйти на пенсию оригинальный интерфейс довольно быстро, так что код будет получить очищены и дополнительные TradeDetail2 не будет длиться вечно!

благодаря

ответ

3

сочувствую - некоторые из моих веб-сервисов пронизана myMethod(), myMethod2(), myMethod3() и т.д. просто потому, что мне нужно, чтобы добавить несколько новых полей.

Будет ли иметь смысл сохранить имя метода и создать новую конечную точку для каждой версии вашего API? например:

Тогда ваши имена методов оставаться разумными, независимо от того, сколько будущих изменений нужно сделать.

Любые приложения, использующие ваш веб-сервис, вероятно, должны быть перезаписаны и/или перестроены по отношению к новому WSDL в любом случае, чтобы использовать новые поля, поэтому почему бы просто не переписать/перестроить их для нового API v1.1 ,

Я нахожу, что это также помогает при общении с владельцами/разработчиками приложений с помощью вашей службы - например, «. Версия [old] нашего веб-сервиса API больше не будет поддерживаться после [даты], убедитесь, что вы используют, по крайней мере, версию [новый]. «

3

Вот почему я предпочитаю иметь полный контроль над XML для сопоставления объектов, чтобы я мог отделить модель от XML-интерфейса. В вашем случае я бы просто добавил новые поля в TradeDetail и рассмотрел их как «необязательные» для обратной совместимости.не Это будет пример XML-> отображение объекта для 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"); 
} 

сервер будет работать с такой же код, возможно, проверка версии клиента, и отображение дополнительных полей, только если клиент поддерживает новую версию протокола.

На мой взгляд, клиент должен быть написан так, чтобы несколько дополнительных полей, добавленных в протокол, не разбивали клиента - у меня нет роскоши быть простым, потому что поставщик восходящего потока добавил новую функциональность и не сообщил мне об этом. Если поставщик изменяет существующие обязательные поля, конечно, клиент нуждается в модификации. Вот почему провайдер upstream должен поддерживать протокол версии и поддерживать старую версию как минимум на пару месяцев.