我想以自下而上的方法生成 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 和给定的代码并使它们匹配
谢谢 :-)