Chapter 28. Developing a Consumer From a WSDL Contract
Abstract
One way of creating a consumer is to start from a WSDL contract. The contract defines the operations, messages, and transport details of the service on which a consumer makes requests. The starting point code for the consumer is generated from the WSDL contract. The functionality required by the consumer is added to the generated code.
28.1. Generating the Stub Code
Overview
The
cxf-codegen-plugin
Maven plug-in generates the stub code from the WSDL contract. The stub code provides the supporting code that is required to invoke operations on the remote service.
For consumers, the
cxf-codegen-plugin
Maven plug-in generates the following types of code:
- Stub code — Supporting files for implementing a consumer.
- Starting point code — Sample code that connects to the remote service and invokes every operation on the remote service.
Generating the consumer code
To generate consumer code use the
cxf-codegen-plugin
Maven plug-in. Example 28.1, “Consumer Code Generation” shows how to use the code generator to generate consumer code.
Example 28.1. Consumer Code Generation
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>outputDir</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>wsdl</wsdl> <extraargs> <extraarg>-client</extraarg> </extraargs> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin>
Where outputDir is the location of a directory where the generated files are placed and wsdl specifies the WSDL contract's location. The
-client
option generates starting point code for the consumer's main()
method.
For a complete list of the arguments available for the
cxf-codegen-plugin
Maven plug-in see Section E.2, “cxf-codegen-plugin”.
Generated code
The code generation plug-in generates the following Java packages for the contract shown in Example 26.1, “HelloWorld WSDL Contract”:
- org.apache.hello_world_soap_http — This package is generated from the
http://apache.org/hello_world_soap_http
target namespace. All of the WSDL entities defined in this namespace (for example, the Greeter port type and the SOAPService service) map to Java classes this Java package. - org.apache.hello_world_soap_http.types — This package is generated from the
http://apache.org/hello_world_soap_http/types
target namespace. All of the XML types defined in this namespace (that is, everything defined in thewsdl:types
element of the HelloWorld contract) map to Java classes in this Java package.
The stub files generated by the
cxf-codegen-plugin
Maven plug-in fall into the following categories:
- Classes representing WSDL entities in the org.apache.hello_world_soap_http package. The following classes are generated to represent WSDL entities:
Greeter
— A Java interface that represents the Greeterwsdl:portType
element. In JAX-WS terminology, this Java interface is the service endpoint interface (SEI).SOAPService
— A Java service class (extendingjavax.xml.ws.Service
) that represents the SOAPServicewsdl:service
element.PingMeFault
— A Java exception class (extendingjava.lang.Exception
) that represents the pingMeFaultwsdl:fault
element.
- Classes representing XML types in the org.objectweb.hello_world_soap_http.types package. In the HelloWorld example, the only generated types are the various wrappers for the request and reply messages. Some of these data types are useful for the asynchronous invocation model.