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 的 map 元素时,它只会调用存在的 setMap() 。但是,生成的服务没有考虑到我对 xsd 的修改(似乎它是从代码中动态重新生成的)。

我正在使用 IBM eclipse 插件来生成 web 服务项目,看起来它正在使用 sun 的 jax-ws 实现来构建应用程序。

我还想稍后从 xsd 中删除一些未使用的属性。

-

你会推荐什么方法来解决这个问题?

以下是我想到的可能性:

  • XmlAdapter(MySuperSet 的每个子类一个)

  • 手动装订(我不知道它是如何工作的)

  • 一个更灵活的库,它尝试使用给定的 xsd 和给定的代码并使它们匹配

谢谢 :-)

4

1 回答 1

1

我最终选择了务实的解决方案:

删除泛型。

于 2012-10-08T17:49:31.027 回答