soundsgood
23-05-2010, 00:57
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.
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.