`
jeooo.li
  • 浏览: 46278 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Xfire根据wsdl文档生成服务端与C#利用wsdl工具生成客户端后互操作时注意的地方

阅读更多

最近这个星期在做项目与外围系统的Web服务,首先是写好wsdl文档,Web服务端是利用eclipse的xfire的插件来生成的,客户端是利用.NET的wsdl工具来生成.利用xfire做web服务时需要注意一些方面:

1、如果wsdl中的元素包含了minOccurs="0"和nillable="true"这两个属性,则生成后的代码的相关类的字段类型是xfire自带的类型,例如:

<xsd:complexType name="CueapSiResponse">
<xsd:sequence>
<xsd:element minOccurs="0" name="actionCode" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="bizCode" nillable="true" type="xsd:string"/>

</xsd:sequence>
</xsd:complexType>

则Java代码为:

public class CueapSiResponse {

    @XmlElementRef(name = "actionCode", namespace = "http://services.cueap.com", type = JAXBElement.class)
    protected JAXBElement<Integer> actionCode;
    @XmlElementRef(name = "bizCode", namespace = "http://services.cueap.com", type = JAXBElement.class)
    protected JAXBElement<String> bizCode;

}

这样一来,当web服务运行时显示的wsdl文档就带有java类型的元素了,wsdl工具生成的客户端与xfire 的web服务就不能交互。所以,为了避免这些,我们在设计wsdl的时候对于int类型的元素,就不需要nillable="true"属性,因为在.NET中,没有赋值是就初始化为0了。string类型的话如果是不是数组的话就应该设置maxOccurs="1" minOccurs="1"就能避免了.

 

2、对于为int类型的元素,在生成java代码时没有加nillable="true"的情况下,则相应的字段类型为Integer,由于Integer可以为null,为了能与C#的int类型对应,应该把Integer改成int类型

 

3、命名空间的差异,当wsdl设计好时,对于xfire生成的服务与wsdl生成的客户端,两边的命名空间是不同的。当xfire的web服务运行时,浏览器中查看wsdl的时候,与原来的wsdl文档不同的地方是把web服务暴露出来的方法参数与其他的数据类处于不同的命名空间中,如wsdl文档为:

<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.cueap.com"  attributeFormDefault="qualified" elementFormDefault="qualified">
<xsd:element name="cueapSiInterface">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="request" nillable="true" type="tns:CueapSiRequest"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="CueapSiRequest">
<xsd:sequence>
<xsd:element minOccurs="0" name="actionCode" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="1" name="bizCode" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

<xsd:schema>

则xfire生成的web服务运行时的wsdl为:

<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.cueap.com "  attributeFormDefault="qualified" elementFormDefault="qualified">
<xsd:complexType name="CueapSiRequest">
<xsd:sequence>
<xsd:element minOccurs="0" name="actionCode" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="1" name="bizCode" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

<xsd:schema>

 

<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.cueap.com/ "  attributeFormDefault="qualified" elementFormDefault="qualified">
<xsd:element name="cueapSiInterface">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="request" nillable="true" type="ns1:CueapSiRequest"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:schema>

这样命名空间就如红色所示,两者不一样了。如果wsdl仅仅是根据原的wsdl文档创建客户端,那么调用服务的时候,会由于命名空间的不一致,导致参数为null值。

 

4、wsdl文档中服务所提供的方法参数不一致,利用xfire生成的web服务,方法的参数在soap中默认的为in0,int1...,返回参数为out,为了能不wsdl文档中的参数一致,可以建立xml文件来影射,具体的可以参看xfire文档中自带的book示例

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics