我正在使用Axis为示例WebService建模。我现在正在做的是试图了解自动化wsdl和代码生成的局限性。
现在有一些服务器端代码:
这是示例Web服务的框架:
public class TestWebService {
public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
....
和我的数据类: public abstract class 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值元素,它在IntAttribute和StirngAttribute中重写。我甚至不知道这是否是一个法律架构(顺便说一句,我认为这不合法)。
更多,如果我尝试从这个wsdl生成客户端(总是使用eclipse工具),生成的源将无法编译,因为AbstractAttribute定义了
Object localValue;
字段和Int / String属性定义
int localValue;
和
String localValue;
..我试图“容纳”源代码(显然没有很多希望),结果是服务器尝试实例化AbstractAttribute实例(抛出InstantiationException)。
所以我的问题是:有一种方法可以模拟上面的数据模型,或者Web服务和XML模式通常不是用于这种特殊情况的最佳工具吗?
答案 0 :(得分:4)
为了解释您遇到的问题,有必要考虑在调用服务时Axis需要做什么。
Axis只是一个java web应用程序......当它收到服务请求时,它会查找你为它定义的映射。如果找到映射,它会尝试创建您为服务请求而定义的必要类的实例。
如果您已将类定义为抽象或接口,那么您将获得InstantiationExceptions,因为无法创建这些类型。当Axis尝试创建wsdl时,它将无法确定要放置的类型,因此它将使用“anyType”。
要回答您的问题:您可以在代码中使用上面的模型,但是您无法将这些类用于Axis。我们在项目中通常做的是:
希望能回答你的问题。