我正在使用Axis对一个样本WebService进行建模。我现在要做的是试图了解哪些是自动wsdl和代码生成的限制。
现在来看一些服务器端代码:
这是示例web服务的框架:
public class TestWebService {
public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
....我的数据类:公共抽象类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;..I试图“容纳”源代码(显然没有太多希望),结果是服务器试图实例化一个AbstractAttribute实例(抛出一个InstantiationException)。
所以我的问题是:有没有一种方法可以对上面的数据模型进行建模,或者web服务和XML模式通常不是这种特定情况下最好的工具?
发布于 2009-02-16 20:21:39
为了解释您遇到的问题,考虑一下当您的服务被调用时Axis需要做什么是有帮助的。
Axis只是一个java web应用程序……当它收到一个服务请求时,它会查找你为它定义的映射。如果它找到一个映射,它会尝试创建一个您定义的必要类的实例来为请求提供服务。
如果您已经将类定义为抽象的或接口的,那么您将获得InstantiationExceptions,因为这些类型不能被创建。当Axis尝试创建wsdl时,它无法确定要放入什么类型,因此将使用“anyType”。
回答您的问题:您可以在代码中使用上面的模型,但不能将这些类与Axis一起使用。我们在我们的项目中通常做的是:
web
希望这回答了你的问题。
https://stackoverflow.com/questions/546779
复制相似问题