JAX-WS specifies a detailed mapping from a service defined in WSDL to the Java classes that will implement that service as a service
provider. The logical interface, defined by the wsdl:portType
element, is mapped to a service endpoint interface
(SEI). Any complex types defined in the WSDL are mapped into Java classes following the mapping defined by the Java Architecture for XML
Binding (JAXB) specification. The endpoint defined by the wsdl:service
element is also generated into a Java
class that is used by consumers to access service providers implementing the service.
The wsdl2java command automates the generation of this code. It also provides options for generating starting point code for your implementation, along with an Ant based makefile to build the application. wsdl2java provides a number of arguments for controlling the generated code.
You can generate the code needed to develop your service provider using the following command:
wsdl2java -ant -impl -server -d outputDir
myService.wsdl
This command does the following:
The -ant
argument generates an Ant makefile, called build.xml
, for your application.
The -impl
argument generates a shell implementation class for each
wsdl:portType
element in the WSDL contract.
The -server
argument generates a simple main()
to run your service provider as
a stand alone application.
The -d
argument directs wsdl2java to write the
generated code to a directory called outputDir
outputDir
.
myService.wsdl
is the WSDL contract from which code is generated.
For a complete list of the arguments for wsdl2java see
wsdl2java in
If you are using Apache Ant as your build system, you can call the code generator using Ant's java task as shown in Example 4.1.
Example 4.1. Generating Service Starting Point Code from Ant
<project name="myProject" basedir="."> <property name="fsf.home" location ="InstallDir
"/> <path id="fsf.classpath"> <fileset dir="${fsf.home}/lib"> <include name="*.jar"/> </fileset> </path> <target name="ServiceGen"> <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true"> <arg value="-ant"/> <arg value="-impl"/> <arg value="-server"/> <arg value="-d"/> <arg value="outputDir
"/> <arg value="myService.wsdl
"/> <classpath> <path refid="fsf.classpath"/> </classpath> </java> ... </target> ... </project>
The command line options are passed to the code generator using the task's arg
element. Arguments
that require two strings, such as -d
, must be split into two arg
elements.
Table 4.1 describes the files generated for creating a service provider.
Table 4.1. Generated Classes for a Service Provider
File | Description |
---|---|
| The SEI. This file contains the interface your service provider implements. You should not edit this file. |
| The endpoint. This file contains the Java class consumers use to make requests on the service. |
| The skeleton implementation class. Modify this file to build your service provider. |
| A basic server mainline that allows you to deploy your service provider as a stand alone process. For more information see Publishing a Service. |
In addition, wsdl2java will generate Java classes for all of the types defined in the WSDL contract.
The generated code is placed into packages based on the namespaces used in the WSDL contract. The classes generated to support
the service (based on the wsdl:portType
element, the wsdl:service
element, and
the wsdl:port
element) are placed in a package based on the target namespace of the WSDL contract. The
classes generated to implement the types defined in the types
element of the contract are placed in a package
based on the targetNamespace
attribute of the types
element.
The mapping algorithm is as follows:
The leading http://
or urn://
are stripped off the namespace.
If the first string in the namespace is a valid Internet domain, for example it ends in .com
or
.gov
, then the leading www.
is stripped off the string, and the two remaining components
are flipped.
If the final string in the namespace ends with a file extension of the pattern .xxx
or .xx
,
then the extension is stripped.
The remaining strings in the namespace are appended to the resulting string and separated by dots.
All letters are made lowercase.