wsdl属性nillable和minOccurs所表⽰的含义
术语约定
⽂章中会反复出现[值类型]、[包装类型]、[普通引⽤类型]、[元素节点]和[元素取值]的表述
1> [值类型]指的是java和.NET中的基本数据类型,如:int;
2> [包装类型]指的是java中的包装类和.NET中的Nullable<T>类型,如:Integer、int?;
3> [普通引⽤类型]指的是除包装类型外的其它引⽤类型;
4> [元素节点]指的是xml⽂档中的⼀个标签节点,我们可以说[元素节点]是必输还是⾮必输,如:<Name>lubiao</Name>;
5> [元素取值]指的是xml标签节点的内容,我们可以说[元素取值]是空还是⾮空,如:<Name>lubiao</Name>表⽰元素取值不为空,<Name xsi:nil="true"/>表⽰元素取值为空;
1、⾸先来看minOccurs和Nillable的定义
如何生成webservice客户端minOccurs:表⽰XML⽂档中某个[元素节点] 是否可以不出现,默认值为1,表⽰必须出现
nillable:表⽰XML⽂档中某个[元素取值] 是否可以为空(形如:<name xsi:nil="true" />),默认值为false,表⽰不能为空
那么,minOccurs和nillable的组合形式就会有4种,如下:
例⼀,值类型:
例⼆,引⽤类型:
2、Java和.NET⾃动⽣成WSDL的规则
在实际开发时我们通常的做法是先编写Server端代码,然后利⽤⼯具⾃动⽣成wsdl描述,最后再利⽤
⼯具读取wsdl进⽽⽣成客户端程序。那么⽤⼯具⽣成wsdl和⽤⼯具反向⽣成代理程序的规则是什么呢?下来对此进⾏实例分析:
2.1 先看.NET⽣成wsdl的规则
实验时所⽤的开发⼯具为VS 2010,⽤vs开发WebService的资料,百度搜索⼀⼤推,这⾥不赘述。
2.1.1、定义数据实体:Person.cs
2.1.2、定义服务类:WebService.cs
helloWorld⽅法有4个参数,前三个参数和Person类的三个属性是⼀样的,加⼊这三个参数的⽬的是进⾏对⽐测试。
2.1.3、查看⽣成的wsdl
2.2.2、定义服务类:WebServiceTest.java
helloWorld⽅法有4个参数,前三个参数和Person类的三个属性是⼀样的,加⼊这三个参数的⽬的是进⾏对⽐测试。
2.2.3、查看⽣成的Wsdl
2.2.4、得出结论
* id参数和Person.id属性都是值类型:[元素节点] 都必输,[元素取值] 都不能为空;
* phoneNbr参数和Person.phoneNbr属性都是包装类型:[元素节点] 都必输,但前者[元素取值]不能为空,后者[元素取值]可以为空;
* name参数和Person.name属性都是普通的引⽤类型:[元素节点] 都必输,但前者[元素取值]不能为空,后者[元素取值]可以为空;
* person参数属于普通引⽤类型:[元素节点]必输,且[元素取值]不能为空;
*总结:此框架⽣成wsdl时认为:
1、作为⽅法参数时,不管是值类型、包装类型还是普通引⽤类型,[元素节点]都为必输项,且[元素取值]都不能为空;
2、作为对象属性时,不管是值类型、包装类型还是普通引⽤类型,[元素节点]都为必输项,其中值类型的[元素取值]不能为空,但包装类型和普通引⽤类型的[元素取值]可以为空。
2.3、Java和.NET的异同
其⼀,对于值类型:
Java和.NET都认为值类型不论是作为 [⽅法参数时] 还是 [对象属性时] ,[元素节点]都为必输项,且[元素取值]都不能为空。
(都合理:这符合值类型的特点,总有⼀个值)
其⼆,对于包装类型:
作为⽅法参数时:java和.NET都认为[元素节点]是必输的,但java认为[元素取值]不能为空,⽽.NET认为[元素取值]可以为空;
(.NET合理,Java不合理。java既要求必输⼜要求值不能为空,那空对象怎么传⼊?可以通过⽣成客户端代理进⾏验证(这⾥不再演⽰),对于phoneNbr参数客户端代码变成了int类型,⽽服务端可是Integer类型)
作为对象属性时:java和.NET都认为[元素是节点]必输的,⽽[元素取值]是可以为空的;
(都合理。java和都要求节点必须出现,然后以nillable=true标识可以传⼊空值)
其三,对于普通引⽤类型:
作为⽅法参数时:java和.NET都认为[元素取值]是不能为空的,但Java同时认为[元素节点]是必输的,⽽.NET认为[元素节点]是⾮必输的;
(.NET合理,Java不合理。java既要求节点必输还要求值不能为空,那空对象怎么传⼊?)
作为对象属性时:java认为[元素节点]是必输的、[元素取值]是可空的;.NET认为[元素节点]是⾮必输的、[元素取值]是不可空的。
(都合理。java始终要求必输,但以nillable=true标识可以传⼊空对象;.NET始终要求元素取值不能为空,但以minOccurs=0来标识可以传⼊空对象)总结:
作为参数时,java出现了很多不合理的情况,可能是因为选的这个框架有bug,这⾥不再关⼼,主要看作为对象属性时的情况。⽂章最开始的时候说到minOccurs和nillable会有4种组合⽅式,在上⾯的实验中java⽤到了两种,⽽.NET⽤到了3种,分别为:
Java:[ minOccurs=1,nillable=false ] 和 [ minOccurs=1,nillable=true ],前者对应值类型,后者对应引⽤类型(包装类型和普通引⽤类型),java压根没⽤minOccrs=0
.NET:[ minOccurs=1,nillable=false ]、[ minOccurs=1,nillable=true ] 和[ minOccurs=0,nillable=false],前者对应值类型,再者对应包装类型,最后对应普
通引⽤类型。
3、Java和.NET由WSDL⾃动⽣成代码的规则
接着上⾯的实验结果,先来做最简单的测试:1、⽤java的client对接java的service⽣成代码;2、⽤.NET的client对接.NET的Service⽣成代码,然后分别观察Client端⾃动⽣成的Person类和Server段的Person是否完全⼀致。这⾥不再演⽰,只说结论,结论是:⽣成的Person分别和各⾃Server端的完全相同。
那如果⽤[ java对接.NET ] 或者[ ⽤.NET对接java ],会是什么结果呢?等⼀等,这么问好像有问题,哪有什么谁对接谁,⼤家对接的都是wsdl,哪⾥知道wsdl后⾯是什么平台!!嗯,那就把minOccurs和nillable的四种组合都列出来,看java和.NET的⽣成规则分别是什么样的,继续。
3.1 先看.NET的规则
3.1.1 定义WSDL,限于篇幅只列出类型定义部分
id对应的是值类型,name对应的是引⽤类型3.1.2 ⽣成数据类
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论