All,
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);
}
}
}