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