2014-01-21 282 views
0

我在寫一個客戶端工具,它使用soap xml webservices(使用CXF從提供的wsdl自動生成類)。我不知道哪個設計最適合構建我想發送給web服務的xml請求。我的問題是要發送的請求必須由許多不同的部分/對象組成。我正在尋找一種乾淨的方式來構建這些部分的創建,最終形成完整的請求。構建XML請求的體系結構?

該請求可能會增加到200-500個XML行,因此在單個類中創建這些請求可能不是個好主意。

爲了說明我的目標,讓我們假設一個請求需要一個Person對象,有些PARAMS必須是對象,如姓名,生日,地址等我想到了以下設計的設定:

1)靜態工具返回構造的XML部分

class XMLUtil { 
    public static PersonType createPerson(String name, String birthday, Address Address) { 
     //the xml person to send within the request 
     PersonType p = new PersonType(); 
     p.setName(name); 
     p.setBirthday(birthday); 
     p.setAddress(address); 
     //assume some more params, but the concept is clear I hope 
     return p; 
    } 
} 

2)靜態工具,增加了構造的XML部分到XML請求

class XMLUtil { 
    public static void addPerson(WebserviceReq req, String name, String birthday, Address Address) { 
     //create person as above 
     req.addPerson(p); 
    } 
} 

3)非靜態服務

class XMLService { 
    private WebserviceReq req; 

    public XMLService(WebserviceReq req) { 
     this.req = req; 
    } 

    public void createPerson(String name, String birthday, Address Address) { 
     //create person as above 
     req.addPerson(p); 
    } 

    public WebserviceReq getWebserviceReq() { 
     return req; 
    } 
} 

用法:

1)

WebserviceReq req = new WebserviceReq(); 
req.addPerson(XMLUtil.createPerson("test", "2014-01-01", address)); 
req.send(); 

2)

WebserviceReq req = new WebserviceReq(); 
XMLUtil.addPerson(req, "test", "2014-01-01", address); 
req.send(); 

3)

WebserviceReq req = new WebserviceReq(); 
XMLService service = new XMLService(req); 
service.createPerson("test", "2014-01-01", address); 
service.getWebserviceReq(); 
req.send(); 

如果不僅爲xml請求構造人物對象,而且還嘗試以某種方式封裝更多的部分,那麼您會更喜歡哪種方法,以便沒有一個類別被炸燬?

回答

0

我做了什麼,並多次使用有很大的影響如下...

每個XML中的元素類型的創建一組類 - 這包括以下...

節點 - 所有元素的基類。支持設置和獲取屬性。 葉 - 任何包含值的元素的基類(簡單元素) 分支 - Leaf元素的集合。兒童通過索引訪問。 實體 - 允許對子項進行密鑰訪問的分支。

與您現在的做法相反,您有一個名爲Person的bean,它具有私有變量並需要代碼來設置和獲取每個值,您可以使用Entity實例並向其添加葉實例,例如...

Entity person = new Entity("Person"); 
person.add(new Leaf<String>("FirstName", "Rodney")); 
person.add(new Leaf<String>("LastName", "Barbati")); 

這裏的力量來自於添加基類將其自己寫成XML的能力。這使您能夠快速創建新類型,而不必編寫代碼將其轉換爲XML。

您還可以通過從Entity派生person類並在其構造函數中添加子元素來使其完全透明。我還建議你添加一個驗證方法來檢查每個需要的孩子的存在和正確的格式。

在Java中提供了用於處理XML元素的類,但它們有些繁瑣且不易使用。你可以考慮包裝它們或者從它們派生出來,使它們更容易使用。

上述內容使您能夠輕鬆輸出XML,而無需樣板代碼 - 如果您使用可以爲給定元素構造給定類的自定義SAX解析器結婚,則可以爲高速流式XML提供完整的基礎這些服務幾乎可以立即支持新的數據類型,只需很少的代碼 - 通常都不會。

如果您發現自己編寫自定義代碼以輸出任何XML結構,請理解您不必 - 有更好的解決方案。

順便說一句:上面的類將很適合在Spring中定義數據結構。

好運,

羅德尼巴爾巴蒂一般

+0

好主意,但我必須根據從Web服務提供的WSDL自動生成web服務類。 Usig你的方法,我不得不進一步創建一個包裝類爲我想要使用的生成的類... – membersound

+1

是的,這是真的 - 你也必須編寫一個新的類,以提供任何功能,因爲你生成的類實際上並沒有任何功能。在那些類中,你將不得不明確地引用你生成的類的所有數據成員。 – user3221160