3.3. JAX-WS Web 服务客户端
3.3.1. 使用和访问 JAX-WS Web 服务 复制链接链接已复制到粘贴板!
在创建了 Web 服务端点(手动或使用 JAX-WS 注释)后,您可以访问其 WSDL。类似于基于 XML 的 Web 服务的 Jakarta EE 是 Jakarta 企业 Web Services 1.4 规范。此 WSDL 可用于创建将与 Web 服务通信的基本客户端应用。从发布的 WSDL 生成 Java 代码的过程称为使用 Web 服务的过程。这在以下阶段发生:
创建客户端工件
在创建客户端工件前,您需要创建 WSDL 合同。以下 WSDL 合同用于本节其余部分中介绍的示例。
以下示例依赖 ProfileMgmtService.wsdl 文件中具有此 WSDL 合同。
<definitions
name='ProfileMgmtService'
targetNamespace='http://org.jboss.ws/samples/retail/profile'
xmlns='http://schemas.xmlsoap.org/wsdl/'
xmlns:ns1='http://org.jboss.ws/samples/retail'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:tns='http://org.jboss.ws/samples/retail/profile'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<types>
<xs:schema targetNamespace='http://org.jboss.ws/samples/retail'
version='1.0' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:complexType name='customer'>
<xs:sequence>
<xs:element minOccurs='0' name='creditCardDetails' type='xs:string'/>
<xs:element minOccurs='0' name='firstName' type='xs:string'/>
<xs:element minOccurs='0' name='lastName' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<xs:schema
targetNamespace='http://org.jboss.ws/samples/retail/profile'
version='1.0'
xmlns:ns1='http://org.jboss.ws/samples/retail'
xmlns:tns='http://org.jboss.ws/samples/retail/profile'
xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:import namespace='http://org.jboss.ws/samples/retail'/>
<xs:element name='getCustomerDiscount'
nillable='true' type='tns:discountRequest'/>
<xs:element name='getCustomerDiscountResponse'
nillable='true' type='tns:discountResponse'/>
<xs:complexType name='discountRequest'>
<xs:sequence>
<xs:element minOccurs='0' name='customer' type='ns1:customer'/>
</xs:sequence>
</xs:complexType>
<xs:complexType name='discountResponse'>
<xs:sequence>
<xs:element minOccurs='0' name='customer' type='ns1:customer'/>
<xs:element name='discount' type='xs:double'/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</types>
<message name='ProfileMgmt_getCustomerDiscount'>
<part element='tns:getCustomerDiscount' name='getCustomerDiscount'/>
</message>
<message name='ProfileMgmt_getCustomerDiscountResponse'>
<part element='tns:getCustomerDiscountResponse'
name='getCustomerDiscountResponse'/>
</message>
<portType name='ProfileMgmt'>
<operation name='getCustomerDiscount'
parameterOrder='getCustomerDiscount'>
<input message='tns:ProfileMgmt_getCustomerDiscount'/>
<output message='tns:ProfileMgmt_getCustomerDiscountResponse'/>
</operation>
</portType>
<binding name='ProfileMgmtBinding' type='tns:ProfileMgmt'>
<soap:binding style='document'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getCustomerDiscount'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>
</output>
</operation>
</binding>
<service name='ProfileMgmtService'>
<port binding='tns:ProfileMgmtBinding' name='ProfileMgmtPort'>
<!-- service address will be rewritten to actual one when WSDL is requested from running server -->
<soap:address location='http://SERVER:PORT/jaxws-retail/ProfileMgmtBean'/>
</port>
</service>
</definitions>
如果您使用 JAX-WS 注解来创建 Web 服务端点,则会自动生成 WSDL 合同,您只需要其 URL。您可以通过导航到 Runtime、选择适用的服务器、选择 Web 服务,然后选择端点来找到此 URL。
wsconsume.sh 或 wsconsume.bat 工具用于使用抽象合同(WSDL),并生成注解的 Java 类和定义它的可选源。该工具位于 EAP_HOME/bin/ 目录中。
$ ./wsconsume.sh --help
WSConsumeTask is a cmd line tool that generates portable JAX-WS artifacts from a WSDL file.
usage: org.jboss.ws.tools.cmd.WSConsume [options] <wsdl-url>
options:
-h, --help Show this help message
-b, --binding=<file> One or more JAX-WS or Java XML Binding files
-k, --keep Keep/Generate Java source
-c --catalog=<file> Oasis XML Catalog file for entity resolution
-p --package=<name> The target package for generated source
-w --wsdlLocation=<loc> Value to use for @WebService.wsdlLocation
-o, --output=<directory> The directory to put generated artifacts
-s, --source=<directory> The directory to put Java source
-t, --target=<2.0|2.1|2.2> The JAX-WS target
-q, --quiet Be somewhat more quiet
-v, --verbose Show full exception stack traces
-l, --load-consumer Load the consumer and exit (debug utility)
-e, --extension Enable SOAP 1.2 binding extension
-a, --additionalHeaders Enable processing of implicit SOAP headers
-n, --nocompile Do not compile generated sources
以下命令从 ProfileMgmtService 文件。源使用软件包的目录结构,该结构通过 .wsdl 文件生成输出中列出的 source. java-p 参数指定。
[user@host bin]$ wsconsume.sh -k -p org.jboss.test.ws.jaxws.samples.retail.profile ProfileMgmtService.wsdl
output/org/jboss/test/ws/jaxws/samples/retail/profile/Customer.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/package-info.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/Customer.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/package-info.class
java 源 文件和已编译 .class 文件都生成到您运行 命令的 目录中的 输出/ 目录中。
| File | 描述 |
|---|---|
|
| 服务端点接口. |
|
| 自定义数据类型. |
|
| 自定义数据类型. |
|
| JAXB XML 注册表. |
|
| JAXB 软件包注释. |
|
| 服务工厂. |
wsconsume 命令生成所有自定义数据类型(JAXB 标注的类)、服务端点接口和服务工厂类。这些工件用于构建 Web 服务客户端实施。
构建服务 Stub
Web 服务客户端使用服务存根来提取远程 Web 服务调用的详细信息。对于客户端应用,Web 服务调用类似于调用任何其他业务组件。在这种情况下,服务端点接口充当业务接口,服务工厂类则不将它构建为服务存根。
以下示例首先创建一个使用 WSDL 位置和服务名称的服务工厂。接下来,它将使用 wsconsume 创建的服务端点接口来构建服务存根。最后,可以像任何其他业务接口一样使用存根。
您可以在 JBoss EAP 管理控制台中找到您的端点的 WSDL URL。您可以通过导航到 Runtime、选择适用的服务器、选择 Web 服务,然后选择端点来找到此 URL。
import javax.xml.ws.Service;
[...]
Service service = Service.create(
new URL("http://example.org/service?wsdl"),
new QName("MyService")
);
ProfileMgmt profileMgmt = service.getPort(ProfileMgmt.class);
// Use the service stub in your application