The standard WSDL description listed below can be found here. You can find additional information at the SOAP Builders round 4 site.
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://soapinterop.org/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://soapinterop.org/types" targetNamespace="http://soapinterop.org/wsdl"> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://soapinterop.org/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://soapinterop.org/types"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="EmptyFault"/> <complexType name="ArrayOfString"> <complexContent> <restriction base="soap-enc:Array"> <attribute ref="soap-enc:arrayType" wsdl:arrayType="string[]"/> </restriction> </complexContent> </complexType> <complexType name="ArrayOfInt"> <complexContent> <restriction base="soap-enc:Array"> <attribute ref="soap-enc:arrayType" wsdl:arrayType="int[]"/> </restriction> </complexContent> </complexType> <complexType name="ArrayOfFloat"> <complexContent> <restriction base="soap-enc:Array"> <attribute ref="soap-enc:arrayType" wsdl:arrayType="float[]"/> </restriction> </complexContent> </complexType> <simpleType name="Enum"> <restriction base="int"> <enumeration value="1"/> <enumeration value="2"/> </restriction> </simpleType> </schema> </types> <message name="echoFaultRequest"/> <message name="echoFaultResponse"/> <message name="echoStringFaultRequest"> <part name="param" type="xsd:string"/> </message> <message name="echoIntArrayFaultRequest"> <part name="param" type="ns2:ArrayOfInt"/> </message> <message name="echoMultipleFaults1Request"> <part name="whichFault" type="xsd:int"/> <part name="param1" type="xsd:string"/> <part name="param2" type="ns2:ArrayOfFloat"/> </message> <message name="echoMultipleFaults2Request"> <part name="whichFault" type="xsd:int"/> <part name="param1" type="xsd:string"/> <part name="param2" type="xsd:float"/> <part name="param3" type="ns2:ArrayOfString"/> </message> <message name="echoMultipleFaults3Request"> <part name="whichFault" type="xsd:int"/> <part name="param1" type="xsd:string"/> <part name="param2" type="xsd:string"/> </message> <message name="echoMultipleFaults4Request"> <part name="whichFault" type="xsd:int"/> <part name="param1" type="xsd:int"/> <part name="param2" type="ns2:Enum"/> </message> <!-- Fault messages --> <message name="EmptyFault"> <part name="part1" type="ns2:EmptyFault"/> </message> <message name="StringFault"> <part name="part2" type="xsd:string"/> </message> <message name="IntFault"> <part name="part3" type="xsd:int"/> </message> <message name="FloatFault"> <part name="part4" type="xsd:float"/> </message> <message name="IntArrayFault"> <part name="part5" type="ns2:ArrayOfInt"/> </message> <message name="StringArrayFault"> <part name="part6" type="ns2:ArrayOfString"/> </message> <message name="FloatArrayFault"> <part name="part7" type="ns2:ArrayOfFloat"/> </message> <!-- Part name same as in StringFault message --> <message name="String2Fault"> <part name="part2" type="xsd:string"/> </message> <message name="EnumFault"> <part name="part9" type="ns2:Enum"/> </message> <portType name="SimpleRpcEncPortType"> <!-- Throws an empty fault --> <operation name="echoEmptyFault" parameterOrder=""> <input message="tns:echoFaultRequest"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault" message="tns:EmptyFault"/> </operation> <!-- Throws fault with xsd:string parameter --> <operation name="echoStringFault" parameterOrder="param"> <input message="tns:echoStringFaultRequest"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault" message="tns:StringFault"/> </operation> <!-- Throws fault with xsd:int[] parameter --> <operation name="echoIntArrayFault" parameterOrder="param"> <input message="tns:echoIntArrayFaultRequest"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault" message="tns:IntArrayFault"/> </operation> <!-- Throws empty fault, fault with a xsd:string parameter and fault with xsd:float[] parameter --> <operation name="echoMultipleFaults1" parameterOrder="whichFault param1 param2"> <input message="tns:echoMultipleFaults1Request"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault1" message="tns:EmptyFault"/> <fault name="SimpleFault2" message="tns:StringFault"/> <fault name="SimpleFault3" message="tns:FloatArrayFault"/> </operation> <!-- Throws fault with xsd:string parameter, fault with xsd:float parameter and fault with xsd:string[] parameters --> <operation name="echoMultipleFaults2" parameterOrder="whichFault param1 param2 param3"> <input message="tns:echoMultipleFaults2Request"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault1" message="tns:StringFault"/> <fault name="SimpleFault2" message="tns:FloatFault"/> <fault name="SimpleFault3" message="tns:StringArrayFault"/> </operation> <!-- Throws two faults, each with xsd:string parameters and same part names. Each part name is bound to a different namespace. --> <operation name="echoMultipleFaults3" parameterOrder="whichFault param1 param2"> <input message="tns:echoMultipleFaults3Request"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault1" message="tns:StringFault"/> <fault name="SimpleFault2" message="tns:String2Fault"/> </operation> <!-- Throws fault with xsd:int parameter and fault with an int enumeration parameter --> <operation name="echoMultipleFaults4" parameterOrder="whichFault param1 param2"> <input message="tns:echoMultipleFaults4Request"/> <output message="tns:echoFaultResponse"/> <fault name="SimpleFault1" message="tns:IntFault"/> <fault name="SimpleFault2" message="tns:EnumFault"/> </operation> </portType> <binding name="SimpleRpcEncBinding" type="tns:SimpleRpcEncPortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/> <operation name="echoEmptyFault"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault"> <soap:fault name="SimpleFault" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <soap:operation soapAction=""/> </operation> <operation name="echoStringFault"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault"> <soap:fault name="SimpleFault" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <soap:operation soapAction=""/> </operation> <operation name="echoIntArrayFault"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault"> <soap:fault name="SimpleFault" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <soap:operation soapAction=""/> </operation> <operation name="echoMultipleFaults1"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault1"> <soap:fault name="SimpleFault1" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <fault name="SimpleFault2"> <soap:fault name="SimpleFault2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <fault name="SimpleFault3"> <soap:fault name="SimpleFault3" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <soap:operation soapAction=""/> </operation> <operation name="echoMultipleFaults2"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault1"> <soap:fault name="SimpleFault1" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <fault name="SimpleFault2"> <soap:fault name="SimpleFault2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <fault name="SimpleFault3"> <soap:fault name="SimpleFault3" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <soap:operation soapAction=""/> </operation> <operation name="echoMultipleFaults3"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault1"> <soap:fault name="SimpleFault1" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl/fault1"/> </fault> <fault name="SimpleFault2"> <soap:fault name="SimpleFault2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl/fault2"/> </fault> <soap:operation soapAction=""/> </operation> <operation name="echoMultipleFaults4"> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </output> <fault name="SimpleFault1"> <soap:fault name="SimpleFault1" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <fault name="SimpleFault2"> <soap:fault name="SimpleFault2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://soapinterop.org/wsdl"/> </fault> <soap:operation soapAction=""/> </operation> </binding> <service name="SimpleRpcEncService"> <port name="SimpleRpcEncPort" binding="tns:SimpleRpcEncBinding"> <soap:address location="http://soapinterop.novell.com/interop/round4/grouph/simplerpc"/> </port> </service> </definitions>
If you invoke wsdl2java on the above WSDL document, you can run this client to interact with the service:
package grouph.simplerpc; import javax.naming.InitialContext; import javax.xml.rpc.Stub; public class Client { public static void main(String[] args) throws Exception { | InitialContext ctx = new InitialContext(); | SimpleRpcEncService service = (SimpleRpcEncService) | ctx.lookup("xmlrpc:soap:grouph.simplerpc.SimpleRpcEncService"); | SimpleRpcEncPortType stub = service.getSimpleRpcEncPort(); | | // set the end point address | if (args.length > 0) | ((Stub)stub)._setProperty("javax.xml.rpc.service.endpoint.address", | args[0]); | | echoEmptyFault(stub); | echoStringFault(stub); | echoIntArrayFault(stub); | echoMultipleFaults1(stub); | echoMultipleFaults2(stub); | echoMultipleFaults3(stub); | echoMultipleFaults4(stub); } public static void echoEmptyFault(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoEmptyFault: "); | | boolean result = Tests.echoEmptyFault(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoEmptyFault:" + | | ex.getMessage()); | | if (java.lang.System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } public static void echoStringFault(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoStringFault: "); | | boolean result = Tests.echoStringFault(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoStringFault:" + | | ex.getMessage()); | | if (java.lang.System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } public static void echoIntArrayFault(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoIntArrayFault: "); | | boolean result = Tests.echoIntArrayFault(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoIntArrayFault:" + | | ex.getMessage()); | | if (System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } public static void echoMultipleFaults1(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoMultipleFaults1: "); | | boolean result = Tests.echoMultipleFaults1(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoMultipleFaults1:" + | | ex.getMessage()); | | if (System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } public static void echoMultipleFaults2(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoMultipleFaults2: "); | | boolean result = Tests.echoMultipleFaults2(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoMultipleFaults2:" + | | ex.getMessage()); | | if (System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } public static void echoMultipleFaults3(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoMultipleFaults3: "); | | boolean result = Tests.echoMultipleFaults3(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoMultipleFaults3:" + | | ex.getMessage()); | | if (System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } public static void echoMultipleFaults4(SimpleRpcEncPortType stub) { | try | { | | System.out.print("echoMultipleFaults4: "); | | boolean result = Tests.echoMultipleFaults4(stub); | | System.out.println(result ? "OK" : "failed"); | } | catch (java.lang.Exception ex) | { | | System.out.println("error invoking echoMultipleFaults4:" + | | ex.getMessage()); | | if (System.getProperty("DEBUG") != null) | | ex.printStackTrace(); | } } }
An implementation of the service endpoint from the above WSDL is listed below:
// Thu Oct 03 12:38:40 PDT 2002 package grouph.simplerpc; import javax.servlet.ServletException; public class ServerImpl extends SimpleRpcEncPortType_ServiceSkeleton { public void init() throws ServletException { | super.init(); | | // Set the WSDL file property | _setProperty("xmlrpc.wsdl", "simple-rpc-encoded.wsdl"); } public void echoIntArrayFault(int[] i0) throws IntArrayFault, java.rmi.RemoteException { | throw new IntArrayFault(i0); } public void echoMultipleFaults4(int i0, int i1, grouph.simplerpc.Enum i2) throws EnumFault, IntFault, java.rmi.RemoteException { | if (i0 == 2) { | | throw new EnumFault(i2); | } else { | | throw new IntFault(i1); | } } public void echoMultipleFaults3(int i0, java.lang.String i1, java.lang.String i2) throws String2Fault, StringFault, java.rmi.RemoteException { | if (i0 == 2) { | | throw new String2Fault(i2); | } else { | | throw new StringFault(i1); | } } public void echoMultipleFaults2(int i0, java.lang.String i1, float i2, java.lang.String[] i3) throws StringArrayFault, FloatFault, StringFault, java.rmi.RemoteException { | if (i0 == 2) { | | throw new StringFault(i1); | } else if (i0 == 3) { | | throw new StringArrayFault(i3); | } else { | | throw new FloatFault(i2); | } } public void echoStringFault(java.lang.String i0) throws StringFault, java.rmi.RemoteException { | throw new StringFault(i0); } public void echoMultipleFaults1(int i0, java.lang.String i1, float[] i2) throws FloatArrayFault, StringFault, EmptyFault, // throws FloatArrayFault, StringFault, EmptyFault_Exception, java.rmi.RemoteException { | if (i0 == 2) { | | throw new StringFault(i1); | } else if (i0 == 3) { | | throw new FloatArrayFault(i2); | } else { | | throw new EmptyFault(); // throw new EmptyFault_Exception(); | } } public void echoEmptyFault() throws EmptyFault, java.rmi.RemoteException // throws EmptyFault_Exception, java.rmi.RemoteException { | throw new EmptyFault(); // throw new EmptyFault_Exception(); } }
Copyright © 2003, 2004 Novell, Inc. All rights reserved. Copyright © 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved.