SOAP服务函数能否返回不同数据类型?WSDL配置方法问询
问题解答:SOAP服务函数返回多类型对象的可行性与WSDL配置
可行性结论
完全可行,但你提到的type="tns:Object1|tns:Object2"写法不符合WSDL/XML Schema规范,无法直接使用。需要借助XML Schema的多态类型特性来实现,以下是两种常用的配置方案:
方案1:使用<xsd:choice>定义可选返回类型
适合两种返回类型无继承关系的场景,通过在响应消息的类型中定义选择项,允许返回Object1或Object2中的任意一种。
步骤1:在XSD中定义包含choice的复合类型
在WSDL的<types>区块(无则新增)中定义一个包含xsd:choice的类型:
<wsdl:types> <xsd:schema targetNamespace="你的命名空间" elementFormDefault="qualified"> <!-- 假设Object1和Object2已提前定义 --> <xsd:complexType name="MyFunctionResultType"> <xsd:choice> <xsd:element name="object1" type="tns:Object1"/> <xsd:element name="object2" type="tns:Object2"/> </xsd:choice> </xsd:complexType> </xsd:schema> </wsdl:types>
步骤2:修改WSDL的响应消息
将原响应消息的part类型替换为上述定义的MyFunctionResultType:
<wsdl:message name = "MyFunctionResponse"> <wsdl:part name = "MyFunctionReturnParameter" type = "tns:MyFunctionResultType"/> </wsdl:message>
方案2:使用抽象基类+派生类型(多态)
若Object1和Object2可共享基类,推荐这种符合面向对象设计的方式。
步骤1:定义抽象基类与派生类型
在XSD中声明抽象基类,让Object1和Object2继承该基类:
<wsdl:types> <xsd:schema targetNamespace="你的命名空间" elementFormDefault="qualified"> <!-- 抽象基类 --> <xsd:complexType name="BaseObject" abstract="true"/> <!-- Object1继承基类 --> <xsd:complexType name="Object1"> <xsd:complexContent> <xsd:extension base="tns:BaseObject"> <!-- Object1的具体字段 --> <xsd:sequence> <xsd:element name="field1" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <!-- Object2继承基类 --> <xsd:complexType name="Object2"> <xsd:complexContent> <xsd:extension base="tns:BaseObject"> <!-- Object2的具体字段 --> <xsd:sequence> <xsd:element name="field2" type="xsd:int"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:schema> </wsdl:types>
步骤2:修改响应消息返回基类类型
将响应消息的part类型设置为抽象基类:
<wsdl:message name = "MyFunctionResponse"> <wsdl:part name = "MyFunctionReturnParameter" type = "tns:BaseObject"/> </wsdl:message>
服务端可返回Object1或Object2的实例,客户端需通过类型判断处理不同返回对象。
注意事项
- 主流SOAP框架(如Axis、JAX-WS)均原生支持上述两种方案的多态特性。
- 若采用方案2,可能需要在客户端添加对应注解(如JAX-WS的
@XmlSeeAlso)来识别派生类型。
内容的提问来源于stack exchange,提问作者Cosmin Grigoras
相关产品推荐
相关产品推荐

