我正在使用axis建模一个示例webservice。我现在要做的是尝试理解自动WSDL和代码生成的限制。
现在,对于某些服务器端代码:
这是示例Web服务的框架:
public class TestWebService {
public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
....
我的数据类:
公共抽象类AbstractAttribute{
字符串名称;
/*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值元素,该元素在in t attribute和stringattribute中被重写。我甚至不知道这是否是一个合法的模式(顺便说一下,我认为这是不合法的)。
更重要的是,如果我尝试从这个WSDL(总是使用Eclipse工具)生成客户机,生成的源将不会编译,因为abstractAttribute定义了
Object localValue;
字段和int/string属性定义
int localValue;
和
String localValue;
…我试图“适应”源(显然没有很多希望),结果是服务器试图实例化一个abstractAttribute实例(抛出一个instantiationexception)。
所以我的问题是:有一种方法可以对上面的数据模型进行建模,或者Web服务和XML模式一般来说不是用于这个特定情况的最佳工具?