Ciao ragazzi, grazie per la guida, sono riuscito a far girare su axis il mio web service ma ora ho un problema con il client, avete qualche suggerimento please?
Ecco il problema:
La mia webService si chiama CL se provo dal browser a richiamare il metodo getUserProfile(int user id) funziona, ad esempio se nel browser metto:
Codice:
http://localhost:8080/axis/services/CL?method=getUserProfile&u=2
Lui mi restituisce:
Codice:
Il file XML specificato apparentemente non ha un foglio di stile associato. L'albero del documento è mostrato di seguito.
−
<soapenv:Envelope>
−
<soapenv:Body>
−
<getUserProfileResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<getUserProfileReturn href="#id0"/>
</getUserProfileResponse>
−
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns1:User">
<ID xsi:type="xsd:int">2</ID>
<authorization xsi:type="xsd:int">3</authorization>
<name xsi:type="xsd:string">Elisa</name>
<surname xsi:type="xsd:string">Esposito</surname>
</multiRef>
</soapenv:Body>
</soapenv:Envelope>
Ok fin qui tutto bene.
Ora sto provando con netbeans a creare un client.
Dal wsdl netbeans mi crea un sacco di classi java di cui per ora ignoro il significato, adesso se creo questa semplice classe:
Codice:
import java.net.*;
import java.rmi.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.*;
import javax.xml.rpc.*;
import org.apache.axis.client.Call;
import stubs.User;
public class AAItoCL {
public static void main(String[] args) {
User u = getUserProfile (2);
System.out.println(u.getName());
}
private static User getUserProfile (int userId){
Object[] param = new Object[1];
param[0]=Integer.valueOf(userId);
User res = new User();
try {
Call call = (Call) new org.apache.axis.client.Service().createCall();
call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/"));
res = (User) call.invoke(new QName("CL", "getUserProfile"), param);
}
catch (MalformedURLException ex) {
System.out.println("Error: invalid URL");
}
catch (ServiceException ex) {
System.out.println("Error: call fault");
}
catch (RemoteException ex) {
System.out.println("Error: WS invocation fault");
}
finally {
return res;
}
}
}
Mi lancia la seguente eccezione:
Codice:
- Exception:
org.xml.sax.SAXException: Deserializing parameter 'getUserProfileReturn': could not find deserializer for type {urn:User}User
at org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:345)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
at org.apache.axis.client.Call.invoke(Call.java:2467)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at org.apache.axis.client.Call.invoke(Call.java:1727)
at AAItoCL.AAItoCL.getUserProfile(AAItoCL.java:120)
at AAItoCL.AAItoCL.main(AAItoCL.java:36)
Credo si tratti di un problema nella serializzazione, come posso risolverlo?
Se provo ad utilizzare un metodo che prende ad esempio un parametro intero e restituisce un booleano tale problema non si verifica.
Netbeans ha creato, leggendo il wsdl, anche altre classi come "User_SOAPBuilder" e "User_SOAPSerializer" che forse potrebbero essermi utili ma non so come possono essere usate.
Please HELP!