我正在使用 Axis 对示例 WebService 进行建模。我现在正在做的是试图了解自动化 wsdl 和代码生成的局限性。
现在对于一些服务器端代码:
这是示例 Web 服务的框架:
public class TestWebService {
public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
....
和我的数据类: public abstract class AbstractAttribute { String name;
/*get/set for name*/
public abstract T getValue();
public abstract void setValue(T value);
}
public class IntAttribute extends AbstractAttribute<Integer> {
Integer value;
public Integer getValue(){ return value; }
public void setValue(Integer value){ this.value = value; }
}
public class StringAttribute extends AbstractAttribute<String> {
String value;
/* ok, you got the point, get/set for value field */
}
Axis2 的 eclipse 工具非常乐意从这些源生成 wsdl,包括属性类的模式,即:
<xs:complexType name="AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IntAttribute">
<xs:complexContent>
<xs:extension base="xsd:AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="StringAttribute">
<xs:complexContent>
<xs:extension base="xsd:AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
现在,如果在这里看到一些奇怪的东西,AbstractAttribute 没有 ** abstract="true" ** 属性,并定义了一个 anyType 值元素,它在 IntAttribute 和 StirngAttribute 中被重写。我什至不知道这是否是一个合法的模式(顺便说一句,我认为它不合法)。
此外,如果我尝试从此 wsdl 生成客户端(始终使用 eclipse 工具)生成的源将无法编译,因为 AbstractAttribute 定义了一个
Object localValue;
字段和 Int/String 属性定义
int localValue;
和
String localValue;
..我试图“容纳”源(显然没有太多希望),结果是服务器尝试实例化一个 AbstractAttribute 实例(抛出一个 InstantiationException)。
所以我的问题是:有一种方法可以对上面的数据模型进行建模,或者 Web 服务和 XML 模式通常不是用于这种特殊情况的最佳工具?