ibm-information-center/dist/eclipse/plugins/i5OS.ic.rzamy_5.4.0.1/50/webserv/wsmigj2ee.htm

115 lines
7.3 KiB
HTML
Raw Normal View History

2024-04-02 14:02:31 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<LINK rel="stylesheet" type="text/css" href="../../../rzahg/ic.css">
<title>Migrate Apache SOAP Web services to Web services for J2EE</title>
</head>
<BODY>
<!-- Java sync-link -->
<SCRIPT LANGUAGE="Javascript" SRC="../../../rzahg/synch.js" TYPE="text/javascript"></SCRIPT>
<h2><A NAME="wsmigj2ee"></A>Migrate Apache SOAP Web services to Web services for J2EE</h2>
<p><strong>Note:</strong> This page applies to WebSphere Application Server - Express Version 5.0.2 and later only.</p>
<p>If you have used the Apache SOAP support to create Web services client applications in WebSphere Application Server - Express Version 5.0 and want use Web services for J2EE, also known as JSR 109, you need to migrate your Version 5.0 client applications.</p>
<p>To migrate these client applications to the JSR 109 Web services standards:</p>
<ol>
<li><p><strong>Plan your migration strategy.</strong>
<br>There are two ways you can port an Apache SOAP client to Java API for XML-based RPC (JAX-RPC) Web services client:</p>
<ul>
<li><p>If you have, or can create, a Web Services Description Language (WSDL) document for the service, consider using the <strong>WSDL2Java</strong> command tool to generate bindings for the Web service. It is more work to adapt an Apache SOAP client to use the generated JAX-RPC bindings, but the resulting client code is more robust and easier to maintain. To follow this path, see <a href="wsdevclient.htm">Develop a Web services client</a>.</p></li>
<li><p>If you do not have a WSDL document for the service, do not expect the service to change, and you want to port the Apache SOAP client with a minimal work, you can convert the code to use the JAX-RPC dynamic invocation interface (DII), which is similar to the Apache SOAP APIs. The DII APIs do not use WSDL or generated bindings.</p></li>
</ul>
<p>You should be aware that since JAX-RPC does not specify a framework for user-written serializers, the JAX-RPC does not support the use of custom serializers. If your application cannot conform to the default mapping between Java, WSDL, and XML supported by WebSphere Application Server - Express, you should not attempt to migrate the application.</p>
<p>The remainder of this topic assumes that you have decided to use the JAX-RPC DII APIs.</p></li>
<li><p><strong>Convert the client application from Apache SOAP to JAX-RPC DII</strong>
<br>The Apache SOAP API and JAX-RPC DII API structures are similar. You can instantiate and configure a call object, set up the parameters, invoke the operation, and process the result in both.</p>
<p>In JAX-RPC, you can create a generic instance of a Service object with <tt>javax.xml.rpc.Service service =
ServiceFactory.newInstance().createService(new QName(&quot;&quot;));</tt></p>
<ol type="a">
<li><p><strong>Create the call object.</strong>
<br>In Apache SOAP, an instance of the call object is created by <tt>org.apache.soap.rpc.Call call = new org.apache.soap.rpc.Call()</tt></p>
<p>In JAX-RPC, an instance of the call object is created by <tt>java.xml.rpc.Call call = service.createCall();</tt></p></li>
<li><p><strong>Set the endpoint URI.</strong>
<br>In Apache SOAP, the target URI for the operation is passed as a parameter to <tt>call.invoke: call.invoke(&quot;http://...&quot;, &quot;&quot;);</tt></p>
<p>In JAX-RPC, the setTargetEndpointAddress() method is used as a parameter to <tt>parametcall.setTargetEndpointAddress(&quot;http://...&quot;);</tt></p>
<p>Apache SOAP has a setTargetObjectURI() method on the call object that contains routing information for the request. JAX-RPC has no equivalent method. The information in the targetObjectURI is included in the targetEndpoint URI for JAX-RPC.</p></li>
<li><p><strong>Set the operation name.</strong>
<br>In Apache SOAP, the operation name is configured on the call object by <tt>call.setMethodName(&quot;opName&quot;);</tt></p>
<p>The setOperationName method, which accepts a <tt>QName</tt> instead of a <tt>String</tt> parameter, is used in JAX-RPC as follows:</p>
<pre> call.setOperationName(new javax.xml.namespace.Qname(&quot;namespace&quot;,
&quot;opName&quot;));</pre></li>
<li><p><strong>Set the encoding style.</strong>
<br>In Apache SOAP, the encoding style is configured on the call object by <tt>call.setEncodingStyleURI(org.apache.soap.Constants.NS_URI_SOAP_ENC);</tt></p>
<p>In JAX-RPC, the encoding style is set by a property of the call object <tt>call.setProperty(javax.xml.rpc.Call.ENCODINGSTYLE_URI_PROPERTY,
&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;);</tt></p></li>
<li><p><strong>Declare the parameters and set the parameter values.</strong>
<br>Apache SOAP parameter types and values are described by parameter instances, which are collected into a Vector and set on the call object before the call, for example:</p>
<pre> Vector params = new Vector ();
params.addElement (new org.apache.soap.rpc.Parameter(name,
type, value, encodingURI));
// repeat for additional parameters... call.setParams (params);</pre>
<p>For JAX-RPC, the call object is configured with parameter names and types without providing their values, for example:</p>
<pre> call.addParameter(<em>name</em>, <em>xmlType</em>, <em>mode</em>);
// repeat for additional parameters call.setReturnType(<em>type</em>);</pre>
where
<ul>
<li><em>name</em> (type <tt>java.lang.String</tt>) is the name of the parameter</li>
<li><em>xmlType</em> (type <tt>javax.xml.namespace.QName</tt>) is the XML type of the parameter</li>
<li><em>mode</em> (type <tt>javax.xml.rpc.ParameterMod</tt>e) the mode of the parameter, for example: IN, OUT, or INOUT</li>
</ul><p></p></li>
<li><p><strong>Make the call.</strong>
<br>In Apache SOAP, the operation is invoked on the call object by <tt>org.apache.soap.Response resp = call.invoke(endpointURI, &quot;&quot;);</tt></p>
<p>In JAX-RPC, the parameter values are collected into an array and passed to <tt>call.invoke</tt> as follows:</p>
<pre>Object resp = call.invoke(new Object[] {parm1, parm2,...});</pre></li>
<li><p><strong>Check for faults.</strong>
<br>In Apache SOAP, you can check for a SOAP fault on the invocation by checking the Response:</p>
<pre> if resp.generatedFault then {
org.apache.soap.Fault f = resp.getFault;
f.getFaultCode();
f.getFaultString(); }</pre>
<p>A <tt>java.rmi.RemoteException</tt> is thrown in JAX-RPC if a SOAP fault occurs on the invocation.</p>
<pre> try
... call.invoke(...)
catch (java.rmi.RemoteException) ...</pre></li>
<li><p><strong>Retrieve the result.</strong>
<br>In Apache SOAP, if the invocation was successful and returns a result, it can be retrieved from the Response object:</p>
<pre>Parameter result = resp.getReturnValue(); return result.getValue();</pre>
<p>In JAX-RPC, the result of the invocation is the returned object when no exception is thrown:</p>
<pre> Object result = call.invoke(...);
...
return result;</pre></li>
</ol></li>
</ol>
<p><strong>Note:</strong> Examples may be wrapped for display purposes.</p>
</body>
</html>