2011-02-07 5 views
4

私は、契約の最初のWebサービス(wsimportjaxws-maven-plugin)でアプリケーションを開発しています。JavaのContract-Firstを使用したWebサービスサイクル

サイクルを処理するには、WSDL/XSDファイルをどのように書き込むべきですか?例えば、departmentemployeesおよびemployeeを参照してdepartment(この記事ではhttp://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.htmlのように)を参照してください。記事では@XmlTransientの注釈が書かれていますが、私はcontract-firstを使用しているため、生成されたクラスを変更することはできません。

私はちょうどそれらのサイクル、私は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

問題は(少なくともWS-I基本プロファイルに準拠したもので)Webサービスの契約ができることですメッセージ内の他のオブジェクトへの参照をエンコードしません。つまり、参照型のフィールドは、それが参照するオブジェクトのフィールドを整列化することによって常にマーシャリングされます。オブジェクトグラフにサイクルが含まれている場合、この再帰は無制限です。

あなたが持っていた場合は、次のとおりです。

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

これは問題を解決する方法の1つですが、通信の両側に余分なコードが必要です(サーバーは参照を破棄し、クライアントがそれを再構築する必要があります)。 循環参照を有効にする@ XmlID/@ XmlIDREFを調べようとしましたが、オブジェクトをObjectクラスに変換し、クライアントサイドで手動の型キャストが必要です。 –

+1

xs:idとxs:idref。 – meriton

関連する問題