轴wsdl生成

时间:2009-02-13 17:08:48

标签: wsdl xsd axis2

我正在使用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模式通常不是用于这种特殊情况的最佳工具吗?

1 个答案:

答案 0 :(得分:4)

为了解释您遇到的问题,有必要考虑在调用服务时Axis需要做什么。

Axis只是一个java web应用程序......当它收到服务请求时,它会查找你为它定义的映射。如果找到映射,它会尝试创建您为服务请求而定义的必要类的实例。

如果您已将类定义为抽象或接口,那么您将获得InstantiationExceptions,因为无法创建这些类型。当Axis尝试创建wsdl时,它将无法确定要放置的类型,因此它将使用“anyType”。

要回答您的问题:您可以在代码中使用上面的模型,但是您无法将这些类用于Axis。我们在项目中通常做的是:

  1. 定义我们需要的类,就像在典型的面向对象的应用程序中那样。
  2. 定义用于Web服务的“仅传输”类。这些类由简单类型组成,可以轻松创建。它们仅用于交换Web服务消息。我们将这些类与Axis一起使用。
  3. 找到这两种类型的方法,以便轻松共享/交换信息。您可以拥有两者共享的接口(但Axis不知道),甚至可以使用BeanUtils.copyProperites来保持两个不同的对象同步。
  4. 希望能回答你的问题。