I've been trying to develop my own serializer & deserializer for some
java classes such as the
java.net.URL class in order to pass URL's to a service method, but the
server sends back a fault:
Fault Code = SOAP-ENV:Server.Exception:
Fault String = org/apache/soap/util/xml/Deserializer
I've attempted to write serializers/deserializers for a simple class
also (class contains only Strings) instead of using the BeanSerializer
and I
still get the above exception.
This is a critical issue...
Below is the code:
Deployment Descriptor
--------------------------------------------------------------------------------------------------------------
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:SimpleURLService">
<isd:provider type="java"
scope="Session"
methods="serviceMethod">
<isd:java
class="examples.omnitide.SimpleURLService.SimpleURLService"
static="false"/>
</isd:provider>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
<isd:mappings>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
qname="xsd:URL"
javaType="java.net.URL"
xml2JavaClassName="examples.omnitide.SimpleURLService.URLDeserializer"/>
</isd:mappings>
</isd:service>
Client that calls soap service
--------------------------------------------------------------------------------------------------------------
// Map the types
SOAPMappingRegistry smr = new SOAPMappingRegistry();
URLSerializer ser = new URLSerializer();
URLDeserializer des = new URLDeserializer();
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new
QName("urn:SimpleURLService", "URL"),
URL.class, ser, des);
// Build the call
Call call = new Call();
call.setSOAPMappingRegistry(smr);
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
call.setTargetObjectURI("urn:SimpleURLService");
call.setMethodName("serviceMethod");
Vector params = new Vector();
params.addElement(new Parameter("request", URL.class, url,
null));
call.setParams(params);
Serializer
--------------------------------------------------------------------------------------------------------------
import java.net.URL;
public class URLSerializer implements Serializer
{
public void marshall(String inScopeEncStyle, Class javaType, Object
src,
Object context, Writer sink, NSStack nsStack,
XMLJavaMappingRegistry xjmr, SOAPContext ctx)
throws IllegalArgumentException, IOException
{
nsStack.pushScope();
SoapEncUtils.generateStructureHeader(inScopeEncStyle, javaType,
context,
sink, nsStack, xjmr);
sink.write(StringUtils.lineSeparator);
URL src2 = (URL) src;
Parameter param;
param = new Parameter("URL", String.class, src2.toString(), null);
xjmr.marshall(inScopeEncStyle, Parameter.class, param, null,
sink, nsStack, ctx);
sink.write(StringUtils.lineSeparator);
sink.write("</" + context + ">");
nsStack.popScope();
}
}
Deserializer
--------------------------------------------------------------------------------------------------------------
public class URLDeserializer implements Deserializer
{
public Bean unmarshall(String inScopeEncStyle, QName elementType, Node
src,
XMLJavaMappingRegistry xjmr, SOAPContext ctx)
throws IllegalArgumentException
{
Element root = (Element)src;
Element tempEl = DOMUtils.getFirstChildElement(root);
URL url = null;
while (tempEl != null)
{
Bean paramBean = xjmr.unmarshall(inScopeEncStyle,
RPCConstants.Q_ELEM_PARAMETER,
tempEl, ctx);
Parameter param = (Parameter)paramBean.value;
String tagName = tempEl.getTagName();
if (tagName.equals("URL"))
{
try
{
url = new URL( (String)param.getValue() );
}
catch (Exception e)
{
throw new IllegalArgumentException("Problem
instantianting bean: " + e.getMessage());
}
}
tempEl = DOMUtils.getNextSiblingElement(tempEl);
}
return new Bean(URL.class, url);
}
}