Good time of day to you, 

I tried this question on soap-user, but didn't get any answers, maybe you can help me..

I'm trying to modify the "messaging" example to send an object from address (from 
"addressbook" example) object using bean encoding.  The code is at the end of the 
message.

If I just run the code I get the following exception:

java.lang.IllegalArgumentException: Body entries must implement the Serializer 
interface.
        at org.apache.soap.Body.marshall(Body.java:166)
        at org.apache.soap.Envelope.marshall(Envelope.java:195)
        at com.ml.edsi.mif.soap.test.SendMessage.main(SendMessage.java:86)

To fix it I modified the Address and PhoneNumber classes to extend BeanSerializer 
which implements Serializer and should work for beans.

In this case I get the following exception:

java.lang.NullPointerException
        at 
org.apache.soap.encoding.soapenc.SoapEncUtils.generateStructureHeader(SoapEncUtils.java:160)
        at 
org.apache.soap.encoding.soapenc.SoapEncUtils.generateStructureHeader(SoapEncUtils.java:116)
        at 
org.apache.soap.encoding.soapenc.BeanSerializer.marshall(BeanSerializer.java:86)
        at org.apache.soap.Body.marshall(Body.java:146)
        at org.apache.soap.Envelope.marshall(Envelope.java:195)
        at com.ml.edsi.mif.soap.test.SendMessage.main(SendMessage.java:86)

The reason it that at in the org.apache.soap.Body(145)  the application sends null 
instead of soap context to BodyEntry.marshal.  So I fixed it by replacing

((Serializer)bodyEntry.value).marshall(actualEncStyle,
                                                   bodyEntry.type,
                                                   bodyEntry.value,
                                                   null,                               
 //****Here is the change***
                                                   sink,
                                                   nsStack,
                                                   xjmr,
                                                   ctx);

with 

((Serializer)bodyEntry.value).marshall(actualEncStyle,
                                                   bodyEntry.type,
                                                   bodyEntry.value,
                                                   ctx,                         
//****Here is the change***
                                                   sink,
                                                   nsStack,
                                                   xjmr,
                                                   ctx);

At this point marshaling works, but I get this strange output from the marshaler:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
        <SOAP-ENV:Body>
                <[Parts={}] xmlns:ns1="urn:po-processor" xsi:type="ns1:address" 
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
                        <phoneNumber xsi:type="ns1:phone">
                                <exchange xsi:type="xsd:string">exch</exchange>
                                <areaCode xsi:type="xsd:int">201</areaCode>
                                <number xsi:type="xsd:string">671-1572</number>
                        </phoneNumber>
                        <zip xsi:type="xsd:int">10100</zip>
                        <streetNum xsi:type="xsd:int">95</streetNum>
                        <state xsi:type="xsd:string">NJ</state>
                        <streetName xsi:type="xsd:string">Green</streetName>
                        <city xsi:type="xsd:string">JCity</city>
                </[Parts={}]>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

And the application fails when I try to send a message:

java.lang.NullPointerException
        at 
org.apache.soap.encoding.soapenc.SoapEncUtils.generateStructureHeader(SoapEncUtils.java:129)
        at 
org.apache.soap.encoding.soapenc.SoapEncUtils.generateStructureHeader(SoapEncUtils.java:116)
        at 
org.apache.soap.encoding.soapenc.BeanSerializer.marshall(BeanSerializer.java:86)
        at org.apache.soap.Body.marshall(Body.java:155)
        at org.apache.soap.Envelope.marshall(Envelope.java:195)
        at 
org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:273)
        at org.apache.soap.messaging.Message.send(Message.java:123)
        at com.ml.edsi.mif.soap.test.SendMessage.main(SendMessage.java:92)




Am I doing something fundamentally wrong?  I will appreciate any help.

Beast regards, 

        Stas.


/*************************************************
* com.ml.edsi.mif.soap.test.SendMessage
*****************************************************/



public class SendMessage {
  public static void main (String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println ("Usage: java " + SendMessage.class.getName () +
                          " SOAP-router-URL envelope-file");
      System.exit (1);
    }

    SOAPMappingRegistry smr = new SOAPMappingRegistry();
    BeanSerializer beanSer = new BeanSerializer();

    smr.mapTypes(Constants.NS_URI_SOAP_ENC,
                 new QName("urn:po-processor", "address"),
                 com.ml.edsi.mif.soap.test.Address.class, beanSer, beanSer);
    smr.mapTypes(Constants.NS_URI_SOAP_ENC,
                 new QName("urn:po-processor", "phone"),
                 com.ml.edsi.mif.soap.test.PhoneNumber.class, beanSer, beanSer);

    Envelope msgEnv = new Envelope();

    Message msg = new Message ();

    Body body = new Body();
    Vector bodyEntries = new Vector();

        PhoneNumber phoneNumber = new PhoneNumber();
        phoneNumber.setAreaCode(201);
        phoneNumber.setExchange("exch");
        phoneNumber.setNumber("671-1572");

        Address address = new Address();
        address.setStreetNum(95);
        address.setStreetName("Green");
        address.setCity("JCity");
        address.setState("NJ");
        address.setZip(10100);
        address.setPhoneNumber(phoneNumber);

    bodyEntries.addElement(new Bean(Address.class, address));

    body.setBodyEntries(bodyEntries);
    msgEnv.setBody(body);

    SOAPContext reqCtx = new SOAPContext();

    StringWriter payloadSW = new StringWriter ();

    msgEnv.marshall (payloadSW, smr, reqCtx); //use smr used for encoding instead of 
null

    String payload = payloadSW.toString ();

    System.out.println(payload);

    msg.send (new URL (args[0]), "urn:this-is-the-action-uri", msgEnv);

    // receive whatever from the transport and dump it to the screen
    System.out.println ("RESPONSE:");
    System.out.println ("--------");
    SOAPTransport st = msg.getSOAPTransport ();
    BufferedReader br = st.receive ();
    String line;
    while ((line = br.readLine ()) != null) {
      System.out.println (line);
    }
  }
}





Reply via email to