2011-02-07 41 views
4

我正在使用合同優先Web服務(wsimportjaxws-maven-plugin)處理應用程序。在Java中使用Contract-First的Web服務週期

如何編寫WSDL/XSD文件以便能夠處理循環?例如參考department參照employeesemployee並參照department(如在這篇文章中http://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html)。文章註釋@XmlTransient註釋,但由於我使用契約優先,我無法以任何方式修改生成的類。

如果我不理會這些週期,我第一次運行web服務,我收到一個錯誤,如:

Caused by: com.sun.istack.SAXException2: 
A cycle is detected in the object graph. This will cause infinitely deep XML: 
[email protected] -> [email protected] -> [email protected] 

回答

3

的問題是,web服務合同(至少WS-I Basic Profile的兼容的)可以不編碼對消息中其他對象的引用。也就是說,引用類型的字段總是通過編組引用的對象的字段來編組。如果對象圖包含循環,則此遞歸是無限的。

也就是說,如果你有:

class A { 
    String name; 
    A a; 
} 

,做:

A a = new A(); 
a.name = "hello"; 
a.a = a; 
marshall(a); 

的XML看起來像

<a> 
    <name>hello</name> 
    <a> 
     <name>hello</name> 
     <a> 
      <name>hello</name> 
      <a> 
       ... 

爲了避免這種情況,週期需要被打破。典型的方法包括,使所述關聯僅在一個方向可通航,編組(任務接收者來重建他們)之前設置反向引用到null,移動協會單獨像班

class A { 
    String name; 
} 
class B { 
    String adress; 
} 

class AWithB { 
    A a; 
    B b; 
} 

和其他選項的主機。

+2

感謝您的回覆,這是解決問題的一種方式,但它需要通信雙方的額外代碼(服務器必須打破引用,客戶端重新構建它)。 我試着看@ XmlID/@ XmlIDREF,它啓用循環引用,但它將對象轉換爲對象類,並需要在客戶端手動類型轉換。 – 2011-02-08 09:16:24