這就是爲什麼我更喜歡完全控制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");
}
服務器將與類似的代碼的工作,可能是檢查客戶端版本,並映射只有當客戶端支持協議的新版本額外的字段。
在我看來,應該編寫客戶端,以便添加到協議中的少量額外字段不會中斷客戶端 - 我沒有奢望因爲上游提供商添加新功能而沒有通知我關於它。如果提供商更改現有的必填字段,當然客戶需要修改。這就是爲什麼上游提供商應該版本協議並支持舊版本至少幾個月。