WSDL Tutorials - Herong's Tutorial Examples - v2.22, by Herong Yang
Creating Service Client with WSDL Document
This section provides a tutorial example on how to create a ServiceClient object with a given WSDL document, a service name and a port name defined in the WSDL document.
According to the manual, Java Axis2 ServicClient class seems to support WSDL 2.0. See the comment on the portName parameter of the constructor method:
public ServiceClient(ConfigurationContext configContext, java.net.URL wsdlURL, QName wsdlServiceName, java.lang.String portName) throws AxisFault Create a service client for WSDL service identified by the QName of the wsdl:service element in a WSDL document. Parameters: configContext - The configuration context under which this service lives (may be null, in which case a new local one will be created) wsdlURL - The URL of the WSDL document to read wsdlServiceName - The QName of the WSDL service in the WSDL document to create a client for portName - The name of the WSDL 1.1 port to create a client for. May be null (if WSDL 2.0 is used or if only one port is there).
Here is a test program, Axis2ServiceClientHelloWsdl20.java, that loads my WSDL 2.0 document, Hello_WSDL_20_SOAP.wsdl
/* Axis2ServiceClientHelloWsdl20.java * Copyright (c) 2009 HerongYang.com. All Rights Reserved. */ import java.io.PrintStream; import java.net.URL; import javax.xml.namespace.QName; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.context.ConfigurationContext; import org.apache.axiom.om.OMElement; class Axis2ServiceClientHelloWsdl20 { public static void main(String[] args) { PrintStream out = System.out; ConfigurationContext config = null; String wsdl = "file:///C:/herong/Hello_WSDL_20_SOAP.wsdl"; String tns = "https://www.herongyang.com/Service/"; String serviceName = "helloService"; String portName = null; try { ServiceClient client = new ServiceClient(config, new URL(wsdl), new QName(tns, serviceName), portName); OMElement request = null; OMElement response = client.sendReceive( new QName(tns, "Hello"), request); out.println(response); } catch (Exception e) { e.printStackTrace(); } } }
I can compile this program with the "-Djava.ext.dirs=\local\axis2\lib\" option with JDK 1.8 or earlier versions, so it will automatically load all JAR files in that directory in the class path.
But with JDK 9 or higher, I got this error:
herong> javac -Djava.ext.dirs=\local\axis2\lib\ \ Axis2ServiceClientHello.java javac: option -extdirs not allowed with target 1.10
One workaround is the use "-cp .;\local\axis2\lib\*" option:
herong> javac -cp .;\local\axis2\lib\* Axis2ServiceClientHelloWsdl20.java herong> java -cp .;\local\axis2\lib\* Axis2ServiceClientHelloWsdl20 log4j:WARN No appenders could be found for logger ... log4j:WARN Please initialize the log4j system properly. WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.apache.ws.commons.schema.utils.DOMUtil (file:/C:/local/axis2/lib/xmlschema-core-2.2.1.jar) to method com.sun.org.apache.xerces.internal.dom .CoreDocumentImpl.getXmlEncoding() WARNING: Please consider reporting this to the maintainers of org.apache.ws.commons.schema.utils.DOMUtil WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release log4j:WARN No appenders could be found for logger (org.apache.axiom.locator.DefaultOMMetaFactoryLocator). log4j:WARN Please initialize the log4j system properly. <hy:HelloResponse xmlns:hy="https://www.herongyang.com/Service/"> Hello from server - herongyang.com. </hy:HelloResponse>
Cool. Apache Axis2/Java 1.7.8 does support WSDL 2.0 documents!
Earlier when I compiled and run it with Axis2 1.4.1, I was getting the following error:
herong> \local\jdk\bin\java -Djava.ext.dirs=\local\axis2\lib\ Axis2ServiceClientHelloWsdl20 org.apache.axis2.AxisFault: WSDLException (at /wsdl:description): faultCode=INVALID_WSDL: Expected element '{http://schemas.xmlsoap.org/wsdl/}definitions'. at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) at org.apache.axis2.description.AxisService.createClientSideAxi... at org.apache.axis2.client.ServiceClient.<init>(ServiceClient.j... at Axis2ServiceClientHelloWsdl20.main(Axis2ServiceClientHelloWs... Caused by: javax.wsdl.WSDLException: WSDLException (at /wsdl:descr... at com.ibm.wsdl.xml.WSDLReaderImpl.checkElementName(Unknown Sou... at com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(Unknown Sou... at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(Unknown Source)
The ServiceClient constructor method is expecting a WSDL 1.1 document by default. I could not find a way to change this default behavior.
Table of Contents
WSDL 2.0 Document Structure and Syntax
WSDL Version 2.0 Part 2: Adjuncts
WSDL 2.0 Document Examples with SOAP Binding
►Using WSDL Document in Java Apache Axis2/Java for WSDL
Downloading and Installing Axis2/Java
org.apache.axis2.client.ServiceClient Class
►Creating Service Client with WSDL Document
WSDL2Java Converting WSDL 2.0 Documents to Stub Classes
Apache Woden for WSDL Documents in Java
SoapUI - Web Service Testing Tool
WSDL 1.1 Document Structure and Syntax
WSDL 1.1 Binding Extension for SOAP 1.1
SoapUI as WSDL 1.1 Testing Tool
WSDL 1.1 and SOAP 1.1 Examples - Document and RPC Styles
PHP SOAP Extension for WSDL 1.1
Apache Axis2/Java for WSDL 1.1
Using WSDL2Java to Generate Web Service Stub Classes
WSDL 1.1 Binding Extension for SOAP 1.2
WSDL 1.1 and SOAP 1.2 Examples - Document and RPC Styles