Byte array as a data type
mrahin Dec 16, 2004 11:32 AMI need to pass a byte[] as a parameter in one of my Web Services methods as follows,
public SPDHMessageDTO process(SPDHMessageDTO data);
where SPDHMessageDTO is defined as follows,
public class SPDHMessageDTO {
// DTO Properties
private String auditReference;
private byte[] spdhMessage;
.....
}
The web service deploys correctly. The wsdl file generated by wstool is as follows,
<definitions name="SPDHProtocolService" targetNamespace="http://com.retail_logic.ws/spdhprotocol"> <types> <schema targetNamespace="http://com.retail_logic.ws/spdhprotocol/types"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="SPDHMessageDTO"> <sequence> <element name="auditReference" type="string"/> <element name="spdhMessage" type="base64Binary"/> </sequence> </complexType> </schema> </types>
Note that the spdhMessage field is declared as "base64Binary" in the wsdl file.
The client is written in Java and the client-side stub is again generated by wstool. If I use stub code where the service is located as below everything works just fine.
private void locateService() {
spdhService = (SPDHProtocolServiceWS) (new
SPDHProtocolService_Impl().getSPDHProtocolServiceWSPort());
}
On the other hand if I use dynamic proxy to locate the service as below I get type mismatch exception on the client side.
private void locateService(String wsdlURI) throws Exception {
if (wsdlURI == null || wsdlURI.length() == 0) {
locateService();
return;
}
ServiceFactoryImpl sf = (ServiceFactoryImpl)
ServiceFactoryImpl.newInstance();
URL wsdlURL = new URL(wsdlURI);
QName qname = new QName(SERVICE_NAMESPACE, SERVICE_NAME);
Service ots = sf.createService(wsdlURL, qname);
spdhService = (SPDHProtocolServiceWS) ots.getPort(new
QName(SERVICE_NAMESPACE, SERVICE_PORT),
SPDHProtocolServiceWS.class);
}
Exception received if dynamic proxy is used:
Error: deserialization error: unexpected element type: expected={http://www.w3.org/2001/XMLSchema}hexBinary, actual={http://www.w3.org/2001/XMLSchema}base64Binary
deserialization error: unexpected element type: expected={http://www.w3.org/2001/XMLSchema}hexBinary, actual={http://www.w3.org/2001/XMLSchema}base64Binary
at com.sun.xml.rpc.encoding.SOAPDeserializationContext.deserializeMultiRefObjects(SOAPDeserializationContext.java:82)
at com.sun.xml.rpc.client.StreamingSender._send(StreamingSender.java:163)
at com.sun.xml.rpc.client.dii.CallInvokerImpl.doInvoke(CallInvokerImpl.java:61)
at com.sun.xml.rpc.client.dii.BasicCall.invoke(BasicCall.java:446)
at com.sun.xml.rpc.client.dii.CallInvocationHandler.doCall(CallInvocationHandler.java:99)
at com.sun.xml.rpc.client.dii.CallInvocationHandler.invoke(CallInvocationHandler.java:71)
at $Proxy0.process(Unknown Source)
Would very much appreciate if anyone could explain what I need to do to use dynamic proxy at the client-side.
Thanks.
- Mohammad Rahin