Yep. Avec une classe sans constructeur, ça marche nickel.
Merci pour ton aide et ta réactivité en tout cas.
Yep. Avec une classe sans constructeur, ça marche nickel.
Merci pour ton aide et ta réactivité en tout cas.
Ah, nouveau problème.
J'ai créé une méthode init() qui me permet de charger un xml et d'en récupérer le contenu.
L'objectif est de créer un fichier de config pour pouvoir indiquer au web service quelle base aller requêter.
Quand je teste ma classe en solo (sans la déployer comme un web service), pas de problème.
Par contre quand je déploie le web service associé à que j'appelle cette méthode init là ça plante.
Voilà le code de la méthode :
L'url appelante : http://localhost:18080/axis/services...an?method=init
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public boolean init() { org.jdom.Document document; SAXBuilder sxb = new SAXBuilder(); try { document = sxb.build(new File("configBDD.xml")); Element racine = document.getRootElement(); this._host = racine.getChild("host").getText(); this._login = racine.getChild("login").getText(); this._password = racine.getChild("password").getText(); //System.out.println(this._host + " " + this._login + " " + this._password); } catch(Exception e) { e.printStackTrace(); return false; } return true; }
Et le retour :
J'ai essayé de placer le fichier configBDD.xml dans le même dossier que le .class ça ne marche pas.<soapenv:Envelope>
−
<soapenv:Body>
−
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>java.lang.reflect.InvocationTargetException</faultstring>
−
<detail>
<ns1:hostname>natoine-laptop</ns1:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
En fait le plus propre serait de pouvoir créer un dossier dans lequel je mettrai le fichier configBDD.xml à la racine de mon Web Service.
Si quelqu'un peut m'aiguiller.
Merci d'avance.
Une idée en l'air pour essayer de savoir dans quel répertoire placer ton fichier xml : exposer dans ton service web la méthode suivante :
Ensuite, en invoquant cette méthode, tu pourras peut-être obtenir le chemin absolu du répertoire où placer ton fichier xml...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public String getPath() { return new File("").getAbsolutePath(); }
Je ne suis pas sûr du résultat, ni même si ton problème peut venir de là, mais c'est tout ce que je peux te proposer...
EDIT : J'ai testé un service avec cette opération sur un serveur Tomcat et elle me retourne le répertoire TOMCAT_HOME...
Ouais j'ai eu la même idée.
Du coup j'ai placé mon fichier au bon endroit et ...
Ca n'a pas l'air d'être ça le problème
Y a pas moyen d'en savoir plus sur les erreurs que crache Axis?
Genre un fichier log.
Bon, après plusieurs test, je me rends compte que c'est cette ligne qui crash :
Je suppose qu'il doit me falloir placer la lib correspondante au bon endroit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SAXBuilder sxb = new SAXBuilder();
Donc à quel endroit devrais-je la mettre?
À propos des erreurs, tu peux éventuellement regarder les fichiers de log de ton serveur d'applications (TOMCAT_HOME\logs pour Tomcat).
À propos de la lib, je suppose qu'elle doit être incluse dans ton projet comme toute autre lib...
Les lib doivent être placées dans le dossier WEB-INF/lib de axis.
Et là ça marche.
Par contre, j'espérais pouvoir renvoyer des ResultSet en retour des méthodes de mon Web Service... Ben non.
J'ai le message d'erreur :
Fault - ; nested exception is:
java.io.IOException: No serializer found for class com.mysql.jdbc.ResultSet in registry org.apache.axis.encoding.TypeMappingDelegate@34f445
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.IOException: No serializer found for class com.mysql.jdbc.ResultSet in registry org.apache.axis.encoding.TypeMappingDelegate@34f445
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:natoine-laptop
Nouveau problème (j'avance petit à petit).
J'ai voulu remplacer mes resultset par une classe serialisable.
Sauf que j'ai dû manquer une étape.
J'ai l'erreur suivante :
En fait, le web service devrait renvoyer un ArrayList d'objets Survey.Fault - ; nested exception is:
java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@1aac775
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@1aac775
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:natoine-laptop
Le code de la classe Survey (ultra simple) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package survey; import java.sql.Timestamp; import java.util.ArrayList; public class Survey implements java.io.Serializable { /** * */ private static final long serialVersionUID = 1361676586418252125L; public int id ; public String title; public String description; public Timestamp date_creation; public ArrayList<Section> sections; public Survey(int _id , String _title , String _description , Timestamp _date) { id=_id; title=_title; description=_description; date_creation=_date; } }
Il semblerait que les ResultSet soient mal tolérés en sérialisation/désérialisation, tu peux sans doute trouver davantage d'informations à ce sujet...
Une solution consiste effectivement à utiliser un JavaBean personnel. Par contre, les JavaBeans soivent suivre certaines conventions dont notamment :
- implémenter l'interface java.io.Serializable
- posséder un constructeur sans argument
- posséder un getter et un setter pour chacun de ses attributs
Pour déployer un service web avec un JavaBean avec Axis, il faut rajouter l'élément suivant au descripteur de déploiement deploy.wsdd :
HOSTNAME, PORT, SERVICENAME, JAVABEANNAME et PACKAGENAME sont à remplacer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <typeMapping xmlns:ns="http://HOSTNAME:PORT/SERVICENAME/" qname="ns:JAVABEANNAME" type="java:PACKAGENAME.JAVABEANNAME" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" />
Enfin, il faut également bien décrire dans le fichier deploy.wsdd chaque opération que le service web doit exposer, par exemple :
operationName, OperationName, hostname, port, ServiceName, outParamName, JavaBeanName, inParamName et type sont à remplacer (je ne sais pas s'il faut absolument respecter la casse).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <operation name="operationName" qname="operNS:OperationName" xmlns:operNS="http://hostname:port/ServiceName/" returnQName="outParamName" returnType="rtns:JavaBeanName xmlns:rtns="http://hostname:port/ServiceName/" soapAction="http://hostname:port/ServiceName/OperationName"> <parameter qname="inParamName" type="tns:type" xmlns:tns="http://www.w3.org/2001/XMLSchema" /> </operation>
Alors, j'ai un service creator qui doit me renvoyer des objets de type Survey.
Survey étant un javabean (j'ai respécté les conventions).
Du coup mon deploy.wsdd devrait ressembler à ça non?
Je dois bien remplacer SERVICENAME par creator?<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" xmlns:ns="http://localhost:18080/SERVICENAME/" qname="ns:Survey" type="java:survey.Survey" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="">
<service name="creator" style="java:RPC">
<parameter name="className" value="web_services.Creator"/>
<parameter name="allowedMethods" value="*"/>
<operation name="operationName" qname="operNS:OperationName" xmlns:operNS="http://hostname:port/ServiceName/" returnQName="outParamName" returnType="rtns:JavaBeanName xmlns:rtns="http://hostname:port/ServiceName/" soapAction="http://hostname:port/ServiceName/OperationName">
<parameter qname="inParamName" type="tns:type" xmlns:tns="http://www.w3.org/2001/XMLSchema" />
</operation>
</service>
</deployment>
Et pour les opérations, ça correspond aux méthodes de creator auxquelles je veux pouvoir accéder par le service?
Exactement, je viens d'écrire le fichier deploy.wsdd suivant :
Bien sur, ça ne marche pas<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" xmlns:ns="http://localhost:18080/creator/" qname="ns:Survey" type="java:survey.Survey" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="">
<service name="creator" style="java:RPC">
<parameter name="className" value="web_services.Creator"/>
<parameter name="allowedMethods" value="*"/>
<operation name="getMySurveys" qname="operNS:getMySurveys" xmlns:operNS="http://localhost:18080/creator/" returnQName="_surveys" returnType="rtns:survey.Survey" xmlns:rtns="http://localhost:18080/creator/" soapAction="http://localhost:18080/creator/getMySurveys">
<parameter qname="_id_user" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema" />
</operation>
</service>
</deployment>
J'ai le message d'erreur suivant :
Sorry, something seems to have gone wrong... here are the details:
Fault - ; nested exception is:
java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@ec1c4d
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@ec1c4d
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:natoine-laptop
Autant pour moi je me suis bien échoué sur ce coup là.
Bah, donc voici ma nouvelle version de deploy.wsdd :
Mais j'ai toujours l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="creator" style="java:RPC"> <parameter name="className" value="web_services.Creator"/> <parameter name="allowedMethods" value="*"/> </service> <typeMapping xmlns:ns="http://localhost:18080/creator/" qname="ns:Survey" type="java:survey.Survey" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" /> <operation name="getMySurveys" qname="operNS:getMySurveys" xmlns:operNS="http://localhost:18080/creator/" returnQName="_surveys" returnType="rtns:survey.Survey" xmlns:rtns="http://localhost:18080/creator/" soapAction="http://localhost:18080/creator/getMySurveys"> <parameter qname="_id_user" type="tns:int" xmlns:tns="http://www.w3.org/2001/XMLSchema" /> </operation> </deployment>
Sorry, something seems to have gone wrong... here are the details:
Fault - ; nested exception is:
java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@1d27069
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@1d27069
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:natoine-laptop
Hmm... Sans conviction, c'est peut-être le Timestamp qui n'est pas sérialisable ?
Sinon, tu peux peut-être essayer d'écrire un service simple utilisant un JavaBean simple (genre un JavaBean Personne avec des attributs nom, prenom, age) et de les déployer, puis de les complexifier petit à petit pour qu'ils se rapprochent de ton service et de ton JavaBean...
Ah, d'après l'api Timestamp implémente bien l'interface serialisable.
J'ai réduit ma classe Survey à juste un attribut de type int.
Et même là j'ai l'erreur :
Au fait, il n'y a pas une histoire de balise <beanMapping>???Fault - ; nested exception is:
java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@1bfefb
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.IOException: No serializer found for class survey.Survey in registry org.apache.axis.encoding.TypeMappingDelegate@1bfefb
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:natoine-laptop
Ca y est ça marche.
Je poste mon wsdd si ça peut en aider d'autres.
Vous noterez donc l'usage de la balise <beanMapping> pour indiquer les bean à serialiser.<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="creator" style="java:RPC">
<parameter name="className" value="web_services.Creator"/>
<parameter name="allowedMethods" value="*"/>
<beanMapping qname="myNS:Survey" xmlns:myNS="urn:BeanService"
languageSpecificType="java:survey.Survey"/>
</service>
</deployment>
Par contre le type Timestamp fout le bordel.
Merci pour l'aide précieuse d'arnaud03.
La suite :
J'aimerai faire un client pour mon web service, qui me permette de récupérer les objets serialisés.
Il y a un exemple de comment faire un client dans http://karamimed.developpez.com/j2ee/tutoriels/axis/#LV
Seulement le seul type de retour proposé dans l'exemple est un type primitif.
Il n'y a pas d'objets serialisés dans l'exemple.
Moi je récupére un Object[] là ou j'aimerai avoir un ArrayList<Survey>...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CreatorService _service = new CreatorServiceLocator(); Creator port = _service.getcreator(); Object[] _surveys = port.getMySurveys(1);
Nouveau problème.
Mon Web Service fonctionne parfaitement sous ubuntu mais dés que j'essaye de le déployer sur Mac os X ça plante.
En fait, mon Web Service fait des requêtes à une base en utilisant JDBC.
Et c'est cette partie là qui ne fonctionne pas sous Mac Os X.
Impossible de créer une connection à la base dans Axis.
Pourtant j'ai bien mis la lib nécessaire dans WEB-INF/lib...
Et on a testé un simple main qui s'appuie sur la même lib pour créer une connection hors axis, ça marche.
Si vous avez une piste?
Merci d'avance.
salut natoine,
est ce que tu as une idée sur comment on utilise les web services pour établir la communication entre deux applications?
Merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager