I guess my mail was way too long for people to actually read it :) Anyway, based on the input of one kind soul, I explored further and finally hit on something that worked. It might not be the right way but it worked for now and I just want to share with the list, in case someone else is banging his head on the wall:
1. Using a customized Encoding Style URI besides Constants.NS_URI_SOAP_ENC always result in an exception something like "Caught SOAPException (SOAP-ENV:Client): No Serializer found to serialize a 'org.apache.soap.rpc.Parameter' using encoding style 'http://xxx.com/test'. 2. Using Constants.NS_URI_SOAP_ENC works. I made a mistake in my serializer. I forgot the end tag "</PurchaseOrder>". So if I had added sink.write("</" + context + '>'); It worked for me. That's all, Han Ming > From: Han Ming Ong <[EMAIL PROTECTED]> > Date: Sun Jan 27, 2002 03:55:45 PM US/Pacific > To: [EMAIL PROTECTED] > Subject: Customized Serializer > > Hi folks, > > Short: > I know how to use a BeanSerializer or sub class of a BeanSerializer > to serialize a customized class. I usually use > Constants.NS_URI_SOAP_ENC when I insert it into SOAPMappingRegistry. > > But I would like to make use of a generic XML Serializer (e.g. > http://www.csse.monash.edu.au/~bren/JSX/) > What encoding style should I use? > > > > Long: > > This is my customized Java class: > > public class PurchaseOrder { > ... > } > > I would like to make use of a generic Java XML Serializer (e.g > http://www.csse.monash.edu.au/~bren/JSX/) as the Serializer and > Deserializer. > > public class PurchaseOrderSerializer implements Serializer, > Deserializer { > 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); > > // Magically obtain a serialized XML string, for example using JSX > String xml = .... > > sink.write(xml); > > nsStack.popScope(); > } > > public Bean unmarshall(String inScopeEncStyle, QName elementType, > Node src, XMLJavaMappingRegistry xjmr, SOAPContext ctx) throws > IllegalArgumentException { > Element root = (Element) src; > PurchaseOrder target; > > // This is sad. > String xml = DOMWriter.nodeToString(src); > > target = (PurchaseOrder).... // Use JSX to get back object > > return new Bean(PurchaseOrder.class, target); > } > > So on the server end, I created this deployment descriptor > > <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" > id="urn:myServer"> > <isd:provider type="java" > scope="Application" > methods="SubmitOrder1"> > <isd:java class="xxx.com.Application" static="true"/> > </isd:provider> > > > <isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener> > > <isd:mappings> > <isd:map encodingStyle="http://xxx.com/test" > xmlns:x="urn:wo-xml-demo" qname="x:PurchaseOrder" > javaType="xxx.com.PurchaseOrder" > java2XMLClassName="xxx.com.PurchaseOrderSerializer" > > xml2JavaClassName="xxx.com.PurchaseOrderSerializerOrderSerializer"/> > </isd:mappings> > </isd:service> > > > This is how I execute my call from client > > PurchaseOrderSerializer poSer = new PurchaseOrderSerializer(); > SOAPMappingRegistry smr = new SOAPMappingRegistry(); > String myEnc = "http://xxx.com/test"; > // Map the types. > smr.mapTypes(myEnc, new QName("urn:wo-xml-demo", > "PurchaseOrder"), PurchaseOrder.class, poSer, poSer); > > // Build the call. > call.setSOAPMappingRegistry(smr); > call.setTargetObjectURI("urn:myServer"); > call.setMethodName("SubmitOrder1"); > call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); > params.addElement(new Parameter("CustomerID", > java.lang.String.class, pin, Constants.NS_URI_SOAP_ENC)); > params.addElement(new Parameter("PurchaseOrder", > PurchaseOrder.class, po, myEnc)); > call.setParams(params); > > // Invoke the call. > try { > resp = call.invoke(serviceURL, ""); > } catch (SOAPException e) { > System.out.print("Caught SOAPException (" + > e.getFaultCode() + "): " + e.getMessage()); > } > > > Problems: > > I always get a SOAPException, something like "Caught SOAPException > (SOAP-ENV:Client): No Serializer found to serialize a > 'org.apache.soap.rpc.Parameter' using encoding style > 'http://xxx.com/test'. > (Here, I'm kind of surprised that the class is not xxx.com.PurchaseOrder > > If I used Constants.NS_URI_SOAP_ENC, the exception would be > > Caught SOAPException (SOAP-ENV:Client): Parsing error, response was: > The element type "faultstring" must be terminated by the matching > end-tag "</faultstring>". > > I also tried Constants.NS_URI_LITERAL_XML and Constants.NS_URI_XMI_ENC > but no success. > > Help please? >
