|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2007
Messaggi: 163
|
[java] inviare un oggetto ad un web service tramite axis e soap
In pratica voglio invocare un servizio presente in un web service da una pagina jsp.
Il servizio del web service è il seguente: public static boolean addPreference(Preference pref) { … } In pratica riceve in input l’oggetto Preference che è cosi fatto: package abstractinterface.AAI.Aobject; import java.util.*; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class Preference implements Serializable { protected String name; protected String slot; protected Vector conditions; protected Action action; protected String prob; protected Vector parameters; public Preference(){ } public void setName(String n) { this.name = n; } public String getName() { return name; } public void setSlot(String s) { this.slot = s; } public String getSlot() { return slot; } public void setConditions(Vector v) { this.conditions = v; } public Vector getConditions() { return conditions; } public void setAct(Action a) { this.action = a; } public Action getAction() { return action; } public void setProb(String a) { this.prob = a; } public String getProb() { return prob; } public void setParameters(Vector v) { this.parameters = v; } public Vector getParameters() { return parameters; } } Come vedi questo oggetto contiene al suo interno un vector di oggetti Condition e di oggetti Parameter, e un oggetto Action. Dopo aver scritto il codice del metodo ne ho effettuato il deploy con il seguente file wsdd: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="urn:AAI" provider="java:RPC" style="rpc" use="encoded"> <parameter name="className" value="abstractinterface.AAI.AAI"/> <parameter name="allowedMethods" value="updateService, newService, userMessage, getAvailableActionPartialOrder, actionHandler, inizialize, register, stopService, getRooms, deleteService, addPreference"/> <parameter name="scope" value="Session"/> <beanMapping qname="myNS:User" xmlns:myNS="urn:AAI" languageSpecificType="java:abstractinterface.AAI.Aobject.User"/> <beanMapping qname="myNS:Service" xmlns:myNS="urn:AAI" languageSpecificType="java:abstractinterface.AAI.Aobject.Service"/> <beanMapping qname="myNS:Action" xmlns:myNS="urn:AAI" languageSpecificType="java:abstractinterface.AAI.Aobject.Action"/> <beanMapping qname="myNS:Condition" xmlns:myNS="urn:AAI" languageSpecificType="java:abstractinterface.AAI.Aobject.Condition"/> <beanMapping qname="myNS:Parameter" xmlns:myNS="urn:AAI" languageSpecificType="java:abstractinterface.AAI.Aobject.Parameter"/> <beanMapping qname="myNS:Preference" xmlns:myNS="urn:AAI" languageSpecificType="java:abstractinterface.AAI.Aobject.Preference"/> <requestFlow> <handler type="soapmonitor"/> </requestFlow> <responseFlow> <handler type="soapmonitor"/> </responseFlow> </service> </deployment> Dove vengono deployati anche altri servizi, quello che conta per adesso, come detto , è addPreference. Quello che ti chiedo è cosa dovrei scrivedere nella pagina jsp (per serializzare gli oggetti) e nel metodo addPreference per deserializzarli. Premetto che gli altri servizi funzionano ma fanno uso solo di tipi predefiniti e di un solo oggetto. (non oggetti incapsulati tra loro) Posto il codice che uso nella jsp ( in realtà lo scrivo per provarlo prima in una classe java, con eclipse): Call call = (Call) new Service().createCall(); call.setTargetEndpointAddress(new URL(webServicePath)); Preference pref = new Preference(); Vector conditions = new Vector(); Condition cond = new Condition(); cond.setId("9"); cond.setService("nomecondition"); cond.setStatus("status"); conditions.add(cond); pref.setConditions(conditions); Action act = new Action(); act.setActionID(9); act.setDescription("gestione"); pref.setAct(act); pref.setName("pref_name"); pref.setProb("pref_prob"); pref.setSlot("pref_slot"); QName qnamePref = new QName("urn:AAI","Preference"); Class classPref = Preference.class; call.registerTypeMapping(classPref, qnamePref, BeanSerializerFactory.class, BeanDeserializerFactory.class); QName qnameProd = new QName("urn:AAI","Action"); Class classProd = Action.class; call.registerTypeMapping(classProd, qnameProd, BeanSerializerFactory.class, BeanDeserializerFactory.class); QName qnameCond = new QName("urn:AAI","Condition"); Class classCond = Condition.class; call.registerTypeMapping(classCond, qnameCond, BeanSerializerFactory.class, BeanDeserializerFactory.class); QName qnameParam = new QName("urn:AAI","Parameter"); Class classParam = Parameter.class; call.registerTypeMapping(classParam, qnameParam, BeanSerializerFactory.class, BeanDeserializerFactory.class); QName qnameServ = new QName("urn:AAI","Service"); Class classServ = Action.class; call.registerTypeMapping(classServ, qnameServ, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.setOperationName(new QName("urn:AAI", "addPreference")); Object rispostaWS = call.invoke(new Object[] { pref }); success = (Boolean) rispostaWS; Nel codice postato, ci ho messo per ogni classe utilizzata lo stresso gruppo di istruzioni, non so se invece basta metterci solo quelle per l’oggetto Preference. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:21.



















