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?

Reply via email to