代码之家  ›  专栏  ›  技术社区  ›  cheng81

轴WSDL生成

  •  3
  • cheng81  · 技术社区  · 15 年前

    我正在使用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模式一般来说不是用于这个特定情况的最佳工具?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Michael Sharek    15 年前

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

    AXIS仅仅是一个Java Web应用程序…当它接收到一个服务请求时,它将查找您为它定义的映射。如果它找到一个映射,它会尝试创建一个您定义的为请求服务的必要类的实例。

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

    要回答您的问题:您可以在代码中使用上面的模型,但不能将这些类与axis一起使用。我们在项目中通常做的是:

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

    希望能回答你的问题。