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