2011-05-31 4 views
2

私はcxfを使用するアプリケーションで作業しています。アプリケーションのベースはwsdlファイルであり、継承の作業にはいくつかの問題があります。Java/CXF/SOAPアプリケーションでの継承の問題?

私は明確な例を描こうとしています(正確には私が取り組んでいるものではありませんが、それはその考えを要約するべきです)。クラス| 私は

<xsd:complexType name="Parent" abstract="true"> 
</xsd:complexType> 
<xsd:complexType name="ChildA"> 
    <xsd:complexContent> 
     <xsd:extension base="tns:Parent"> 
      <xsd:sequence> 
       <xsd:element name="attr1" type="xsd:double"/> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 
<xsd:complexType name="ChildB"> 
    <xsd:complexContent> 
     <xsd:extension base="tns:Parent"> 
      <xsd:sequence> 
       <xsd:element name="attr2" type="xsd:double"/> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

JavaコードがWSDL2Javaのを使用して生成された場合、すべてが正常に動作しますが、次のしているタイプの定義では、私も生成された子(B A)に拡張し見ることができます。

しかし、私は私が(CXFによって生成されたJavaScriptを使用して)クライアント側からメソッドを呼び出す場合、入力パラメータとして、親の型

<xsd:element name="methodInput"> 
    <xsd:complexType> 
     <xsd:sequence > 
      <xsd:element name="input" type="tns:Parent"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

の要素をとる方法を実装する場合次(のRemoteControlは、クライアント側のSOAP交換を扱うオブジェクトです)コール:Java側で

var childA=new __childA(); 
childA.setAttr1(100); 
RemoteControl.method(childA); 

私はすべてのいずれかにリンクされている正確なラインを交換するには、次のエラー(...がありそこを持っています〜にcxfまたは)sun.xmlします

org.apache.cxf.interceptor.Fault: Unmarshalling Error: Unable to create an instance of Parent 
... 
Caused by: javax.xml.bind.UnmarshalException 
- with linked exception: 
[javax.xml.bind.UnmarshalException: Unable to create an instance of Parent 
- with linked exception: 
[java.lang.InstantiationException]] 
... 
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of Parent 
- with linked exception: 
[java.lang.InstantiationException] 
... 
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of Parent 
- with linked exception: 
[java.lang.InstantiationException] 
... 
Caused by: java.lang.InstantiationException 
... 

ただし、入力パラメータの宣言は

<xsd:element name="methodInput"> 
    <xsd:complexType> 
     <xsd:sequence > 
      <xsd:element name="input" type="tns:childA"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

すべてが正常に動作している場合です。

Parentクラスを入力パラメータとして使用できるかどうかは疑問です。それが可能ならば、私はその仕事をするために欠けているものです。

ありがとうございました。

編集:

私は私がしたかったのですが、私は道の周りに考え出しまったく同じ作業をすることを得るために管理していませんでした。 xmlスキーマの他のオプションを使用しました。そのうちの2つは、文脈に応じて動作するように見えます。

(少数のお子様のための)選択肢を使用して最初に:

<xsd:element name="methodInput"> 
    <xsd:complexType> 
     <xsd:choice > 
      <xsd:element name="inputA" type="tns:childA"/> 
      <xsd:element name="inputB" type="tns:childB"/> 
     </xsd:choice> 
    </xsd:complexType> 
</xsd:element> 

第二に任意の要素(多数の選択肢がある場合)

<xsd:element name="methodInput"> 
    <xsd:complexType> 
     <xsd:sequence > 
      <xsd:any/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

を使ってでも、この1つはより少しを求めているようですサーバー側のコードを削除します。

P.S:<xsd:element name="methodInput" type="anyType" />は、クライアント側で誤ったメッセージを生成するように思われるため、シーケンスを使用しました。

答えて

0

javascriptクライアントは型継承をサポートしていないと思います。それにはたくさんの制限があります。パッチは大歓迎です。 :-)

JAXBが適切にマップできるように、特にjavascriptをxsi:type = "ns:Child1"属性を出力するように更新する必要があります。

+0

一般的な方法が必要な場合は、私自身で修正する必要があります。返事をありがとう、私は何か興味深い思い付くなら私の答えを更新します。 –

0

エラーメッセージを見ると、Parentからabstract = "true"を削除すると問題が解決されている可能性があります。

+0

このソリューションはエラーメッセージを削除しません。しかし、サーバー側では、メッセージはchildAを親に変換します(たとえば、属性はありません)。 –