ボトムアップアプローチでWebサービスを生成したいのですが、ジェネリックでは正しく機能しません。
私はこれらのように見え、ほとんど変更できないクラスをいくつか持っています(おそらくいくつかの注釈):
public class MySuperSet<K,V> {
private Map<K,V> map;
...
// getter and setter for map
}
public class PearSet extends MySuperSet<String, Pear> {
}
public class AppleSet extends MySuperSet<String, Apple> {
}
生成されたxsdは次のようになります:
<xs:complexType name="mySuperSet">
<xs:sequence>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="key" minOccurs="0" type="xs:anyType"/>
<xs:element name="value" minOccurs="0" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="pearSet">
<xs:complexContent>
<xs:extension base="tns:mySuperSet">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="appleSet">
<xs:complexContent>
<xs:extension base="tns:mySuperSet">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
そして、リンゴとナシの定義も生成されません!
私が期待しているxsdはもっとこのようになると思います:
<xs:complexType name="pearSet">
<xs:sequence>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="key" minOccurs="0" type="xs:string"/>
<xs:element name="value" minOccurs="0" type="tns:pear"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="appleSet">
<xs:sequence>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="key" minOccurs="0" type="xs:string"/>
<xs:element name="value" minOccurs="0" type="tns:apple"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
手動で変更すればうまくいくのではないかと思いました。私が推測するように、appleSetのマップ要素を設定する必要がある場合は、存在するsetMap()を呼び出すだけです。ただし、生成されたサービスは、xsdの変更を考慮していません(コードから動的に再生成されているようです)。
IBM eclipseプラグインを使用してWebサービスプロジェクトを生成していますが、Sunのjax-wsの実装を使用してアプリケーションをビルドしているようです。
また、後でxsdからいくつかの未使用の属性を削除したいと思います。
-
この問題を解決するためにどのようなアプローチをお勧めしますか?
これが私が考えた可能性です:
XmlAdapter(MySuperSetのサブクラスごとに1つ)
手動バインディング(どのように機能するかわかりません)
特定のxsdと特定のコードを使用してそれらを一致させようとするより柔軟なライブラリ
ありがとう :-)