1

ボトムアップアプローチで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と特定のコードを使用してそれらを一致させようとするより柔軟なライブラリ

ありがとう :-)

4

1 に答える 1

1

私は最終的に実用的な解決策を選択します:

ジェネリックを削除します。

于 2012-10-08T17:49:31.027 に答える