- 论坛徽章:
- 0
|
1.3 Java数据类型如何映射到SOAP/XML类型
互操作性是SOAP实现的一种挑战,如果你想让你的服务可以和其他平台或其他语言实现的服务一起工作,那么你就需要了解这个问题。Java类型和WSDL/XSD/SOAP类型的之间的映射是由JAX-RPC定义的,下面是它们之间的简单关系:
WSDL到Java标准映射
xsd:base64Binary
byte[]
xsd:boolean
boolean
xsd:byte
byte
xsd:dateTime
java.util.Calendar
xsd:decimal
java.math.BigDecimal
xsd:double
double
xsd:float
float
xsd:hexBinary
byte[]
xsd:int
int
xsd:integer
java.math.BigInteger
xsd:long
long
xsd:QName
javax.xml.namespace.QName
xsd:short
short
xsd:string
java.lang.String
1.3.1在严格的互操作下Axis能通过SOAP发送什么呢?
Java Collections
一些Collection类,比如hashtable,它确实用自己的serializers,但是没有和其他SOAP实现进行互操作的标准,并且没有任何关于转化复杂对象的SOAP标准。最可信赖的方法是通过数组来传递对象集合。
1.3.2通过SOAP Axis不能发送什么呢?
任何没有预先注册的对象。
我们不能发送一个任意的Java对象,并且期望对方能够理解。使用RMI你可以发送和接收序列化的java对象,那是因为两端都使用的是Java。Axis只能发送那些能被注册的Axis序列化器序列化的对象。下面将介绍怎么使用BeanSerializer来序列化任意一个符合JavaBean格式的类。
1.3.3编写自己的Bean——使用BeanSerializer。
Axis不需要你书写任何代码就有能力seriliae/deserialize任意一个符合get/set存取的JavaBeam格式的类。你需要做的就是告诉Axis把那一个java类映射到那一个XML Schema类型,设置一个bean映射看起来是这个样子:
languageSpecificType="java:my.java.type"/>
这里的标签映射一个java类到一个XML QName。你将注意到它有两个重要的属性,qname和languageSpecificType。这个例子中我们映射java:my.java.type类到XML QName [someNamespace]:[local]
现在来让我们看看在实际应用中它是怎么工作的。我们看例子
samples/example5/BeanService.java
,我们将看到服务方法的参数一个Order对象。因为Order对象不是Axis能理解的一个基本类型,如果不进行映射运行这个程序我们将得到一个fault。但是我们在我们的部署文件中加入beanMapping,它将能很好的运行。下面是运行的结果:
% java org.apache.axis.client.AdminClient -llocal:///AdminService deploy.wsdd
Done processing
% java samples.userguide.example5.Client -llocal://
Hi, Glen Daniels!
You seem to have ordered the following:
1 of item : mp3jukebox
4 of item : 1600mahBattery
If this had been a real order processing system, we'd probably have charged
you about now.
%
当Bean不能满足你的需要时可以自定义序列化器,可以参考前面章节。
1.4使用Axis的WSDL
9.1.4.1获取部署服务的WSDL
当你使用Axis发布一个服务,将会有唯一一个URL对应这个服务。对JWS文件来说,它的URL就是指向jws文件自己。对非jws服务,具体的URL就是:“http://:/axis/services/”。
如果你使用浏览器通过URL访问服务,你将看到一个信息指出这是一个Axis服务,并且你应该通过SOAP来访问它。如果你在URL后面加上“?wsdl”,Axis将自动生成服务的描述文件wsdl。你可以告诉你的在线伙伴通过这个连接来获取这个服务的WSDL,这样他们就能使用工具,比如.NET,SOAP或者其他支持WSDL的工具来访问你的服务。
1.4.2 WSDL2Java :从WSDL来建立stubs,skeletons和数据类型。
客户端bindings:
Axis的WSDL-TO-Java工具是"org.apache.axis.wsdl.WSDL2Java"。你可以使用下面方式调用工具:
% java org.apache.axis.wsdl.WSDL2Java (WSDL-file-URL)
这样就会产生客户程序需要的bindings,当从WSDL生成客户端的bindings时Axis遵守JAX-RPC标准。我们执行一下命令:
% cd samples/addr
% java org.apache.axis.wsdl.WSDL2Java AddressBook.wsdl
产生的文件存放在AddressFetcher2目录下,把它们放在这个目录下是因为把WSDL中的target namespace映射成了Java packages。
至于WSDL的各各部分是怎么映射到响应的java程序,请看前面章节。我们这里只探讨一下复杂类型bean的映射过程。
从WSDL类型生成的java类,将在使用WSDL的tyep来命名。这个类一般来说就是一个Bean。例如下面的WSDL:
WSDL2Java将产生下面代码:
public class Phone implements java.io.Serializable {
public Phone() {...}
public int getAreaCode() {...}
public void setAreaCode(int areaCode) {...}
public java.lang.String getExchange() {...}
public void setExchange(java.lang.String exchange) {...}
public java.lang.String getNumber() {...}
public void setNumber(java.lang.String number) {...}
public boolean equals(Object obj) {...}
public int hashCode() {...}
}
其他元素的映射前面相关部分已经做过介绍。
1.4.3 Java2WSDL:从java程序生成WSDL
第一步:提供一个Java接口或着类。
写一个java接口或类,编译这个程序,这里是一个接口描述一个web服务。
package samples.userguide.example6;
/**
* Interface describing a web service to set and get Widget prices.
**/
public interface WidgetPrice {
public void setWidgetPrice(String widgetName, String price);
public String getWidgetPrice(String widgetName);
}
第二步:使用Java2WSDL生成WSDL
使用Java2WSDL工具从上面的接口生成WSDL。下面是调用这个工具的命令:
% java org.apache.axis.wsdl.Java2WSDL -o wp.wsdl
-l"http://localhost:8080/axis/services/WidgetPrice"
-n "urn:Example6" -p"samples.userguide.example6" "urn:Example6"
samples.userguide.example6.WidgetPrice
这里:
-o 指定了生成的WSDL文件名称
-l 指定了服务的位置
-n WSDL文件的target namespace
-p 指定了从包名到namespace的映射
类指定了服务包含的接口。
生成的WSDL文档将包含相应的WSDL类型,消息,portType,bindings和支持SOAP RPC的服务描述,web服务的编码。如果你定义的接口方法引用了其他的类,Java2WSDL工具将生成相应的xml类型来替代这个类或任何嵌入或继承类型。这个工具支持JAX-RPC复杂类型(bean class),xtension classes, enumeration classes, arrays 和Holder classes.。
第三步:使用WSDL2Java创建Bindings
使用生成的WSDL文件为web服务生成相应的client/server bindings。
% java org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true
-Nurn:Example6 samples.userguide.example6 wp.wsdl
这将生成下列文件
现在你拥有了部署服务,建立客户程序所需要的所有文件了。
注意:程序源代码 请查看官方网站!
原文地址
http://ws.apache.org/axis/java/user-guide.html#ConsumingWebServicesWithAxis
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/36006/showart_394261.html |
|