Details
-
Bug
-
Status: Open
-
Minor
-
Resolution: Unresolved
-
1.3
-
None
-
None
-
Client on Windows XP Pro, Server (Tomcat and Axis) on RedHat Linux
Description
Problem:
- transmitting a simple object via SOAP
- object has 4 attributes, two "long" values, one "int" value and one Java String value
- problem is with deserialisation of longs
- object's constructor is invoked with the first long's value for both long parameters
- 2nd long's value is never used
- problem seems to be in org.apache.axis.encoding.ConstructorTarget.java line 88
- args[c] = values.get causes the first value of a type to be returned, regardless of whether or not ir was returned already
- fix implemented by replacing above line with:
args[c] = values.remove;
- not sure of the wider implications of this fix, however.
/*
- Some client code to test this
*/
package soaptest;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class ProfileClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8087/axis/services/ProfileService";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName("http://soapinterop.org", "addSubscriber"));
call.registerTypeMapping(java.lang.Class.forName("soaptest.Subscriber"), new QName("Subscriber"), new org.apache.axis.encoding.ser.BeanSerializerFactory(java.lang.Class.forName("soaptest.Subscriber"), new QName("Subscriber")), new org.apache.axis.encoding.ser.BeanDeserializerFactory(java.lang.Class.forName("soaptest.Subscriber"), new QName("Subscriber")));
Subscriber sub = new Subscriber (555555, 358408, 1, "jussi@sonera.fi");
System.out.println("About to invoke..." + sub.toString());
call.invoke(new Object[]
);
}
catch (java.rmi.RemoteException ex)
catch (Exception ex)
{ System.err.println("Problem executing client: " + ex.toString()); } }
}
/*
- This class should be on client and server
- /
package soaptest;
public class Subscriber implements java.io.Serializable {
public Subscriber(long imsi, long msisdn, int operator, String URI)
public long getIMSI()
{ System.out.println("Subscriber.getIMSI(): returning " + myIMSI); return myIMSI; }public long getMSISDN()
{ System.out.println("Subscriber.getMSISDN(): returning " + myMSISDN); return myMSISDN; }public int getOperator()
{ System.out.println("Subscriber.getOperator(): returning " + myOperator); return myOperator; }public String getURI()
{ System.out.println("Subscriber.getURI(): returning " + myURI); return myURI; }public void setIMSI(long imsi)
{ myIMSI = imsi; }public void setMSISDN(long msisdn)
{ myMSISDN = msisdn; }public void setOperator(int operator)
{ myOperator = operator; }public void setURI(String uri)
{ myURI = uri; }public String toString()
{ return "IMSI: " + myIMSI + ", MSISDN: " + myMSISDN + ", operator: " + myOperator + ", URI: " + myURI; } private long myIMSI;
private long myMSISDN;
private int myOperator;
private String myURI;
}
/*
- this should be deployed as a web service
*/
package soaptest;
import java.util.*;
public class ProfileAccess {
public ProfileAccess()
public void addSubscriber(Subscriber sub)
{ System.err.println("The subscriber being added is " + sub.toString()); }}