Developing a consumer - SelfTry-wsdl2java
练习内容:通过wsdl文件生成对应java类。
练习步骤:
1. In http://cxf.apache.org/docs/developing-a-consumer.html
copy the whole content of HelloWorld WSDL Contract
and save it as hello_world.wsdl in F:\Tim-Work\ProgramTest-Area\ folder.
2. start a command window, go to F:\Tim-Work\ProgramTest-Area\ directory and enter the following command:
wsdl2java -ant -client -d ClientDir hello_world.wsdl
生成规则总结:
1) 在wsdl的types部分,schema标签内,共有8个element。
sayHi
sayHiResponse
greetMe
greetMeResponse
greetMeOneWay
pingMe
pingMeResponse
faultDetail
2)所有这些types都是定义在name space(http://apache.org/hello_world_soap_http/types)中。
因此,对应的生成类目录为org.apache.hello_world_soap_http.types
在F:\Tim-Work\ProgramTest-Area\ClientDir\org\apache\hello_world_soap_http\types中,
一共生成了10个java 文件。
除了与wsdl types部分同名的8个类外,还有package-info.java和ObjectFactory.java两个类。
3)wsdl定义与java类文件的关系如下:
(1)
wsdl定义:
<element name="sayHi">
<complexType/>
</element>
java文件:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "sayHi")
public class SayHi {
}
(2)
wsdl定义:
<element name="sayHiResponse">
<complexType>
<sequence>
<element name="responseType" type="string"/>
</sequence>
</complexType>
</element>
java文件:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"responseType"})
@XmlRootElement(name = "sayHiResponse")
public class SayHiResponse {
@XmlElement(required = true)
protected String responseType;
public String getResponseType() {
return responseType;
}
public void setResponseType(String value) {
this.responseType = value;
}
}
4)根据portTypes,Binding,Service生成的java文件有:
Greeter.java -> wsdl:portType
Greeter_SoapPort_Client.java
PingMeFault.java -> wsdl:binding -- wsdl:operation -- wsdl:fault, extends Exception class
SOAPService.java -> wsdl:service
5)在Greeter.java(interface)中,四个方法对应portTypes里四个operation。
规律是:
如果wsdl文件对应的type中定义了request,则有:
@WebParam(name = "requestType", targetNamespace = "http://apache.org/hello_world_soap_http/types")
java.lang.String requestType
如果wsdl文件对应的type中定义了response,则有:
@WebResult(name = "responseType", targetNamespace = "http://apache.org/hello_world_soap_http/types")
如果portType中定义了wsdl:input,则有:
@RequestWrapper(localName = "greetMe", targetNamespace = "...", className = "...")
如果portType中定义了wsdl:output,则有:
@ResponseWrapper(localName = "greetMeResponse", targetNamespace = "...", className = "...")
如果只有wsdl:input没有wsdl:output,则有:
@Oneway
如果操作中有<wsdl:fault name="pingMeFault" message="tns:pingMeFault"/>,则有:
public void pingMe() throws PingMeFault;
6) 在SOAPService.java中,类定义前有如下annotation description:
@WebServiceClient(name = "SOAPService",
wsdlLocation = "file:hello_world.wsdl",
targetNamespace = "http://apache.org/hello_world_soap_http")
类定义内部存在如下内容:
a 静态程序块,用于初始化WSDL_LOCATION便量
b 三个基本SOAPService构建子,三个引入WebServiceFeatures参数需要endorse JAX-WS 2.2 jar file的构建子
c 两个getSoapPort方法,方面定义前有如下annotation:
@WebEndpoint(name = "SoapPort")
7) Greeter_SoapPort_Client.java。
在这个类得开始就有注释说明它并不完整,需要进行后续开发。
这个类有一个main方法,方法基本内容如下:
a 获取wsdlURL信息
b 根据url和QName(service name)初始化SOAPService 类
c 嚼用getSoapPort方法,获得port,即Greeter类
d 调用Greeter类中声明的方法实现 WS 服务。