Salut à tous.
J'ai un petit problème en ce moment.
Je suis sur un exemple classique de classe java qui gère un compte de banque.
Donc opération de consultation du solde, dépôt et retrait.
J'ai donc une classe java que j'ai déployé grâce à Axis (1.4) et Tomcat (6 je crois). J'arrive à faire mes opérations et même à garder "en mémoire" mon solde grâce à cette fabuleuse propriété "scope" dans le wsdd..
Bref, pour pousser un peu l'exemple, et parce que je vais en avoir besoin dans mon projet, j'aimerai faire intervenir un autre web service.
J'ai choisi de le faire intervenir au moment de l'opération de retrait puisqu'il faut une vérification comme quoi le solde est bien supérieur au montant à retirer demandé, avec renvoi de true ou false selon le cas.
Et donc voilà le code.
J'ai "incorporé" directement dans la méthode en question le code de création de service, d'appel, etc..
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
31
32
33
34
35
36
37
38
39
40
41
42
43 import org.apache.axis.client.*; import javax.xml.namespace.*; import javax.xml.rpc.ParameterMode; public class Compte { int solde; public Compte() { solde=0; } public void depotDe(int montant) { solde=solde+montant; } public void retraitDe(int montant) { try{ Service service= new Service (); Call call = (Call)service.createCall(); String endpoint = "http://localhost:8080/axis/services/VerifService"; call.setTargetEndpointAddress( new java.net.URL(endpoint)); call.setOperationName(new QName(endpoint,"RetraitPossible")); call.addParameter("n1", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN); call.addParameter("n2", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN); call.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","boolean")); Boolean retrait= (Boolean)call.invoke(new Object[]{solde,montant}); if (retrait==true) { solde=solde-montant; } }catch (Exception e){ System.err.println(e.toString());} } public int valeurDuSolde () { return solde; } }
Pour la vérification, j'ai donc créé une nouvelle classe (qui sera mon deuxième web service) :
Maintenant, je vous donne le client, utilisé pour tester tout ca:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class Verif { public Verif () {} public boolean RetraitPossible (int solde, int retrait) { if (retrait > solde) return false; else return true; } }
En plus clair, il y a d'abord un dépôt de 100 qui est fait, suivi d'un retrait de 200 et on finit par un affichage du solde du compte. 3 méthodes utilisées donc.
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
31
32
33
34
35
36
37
38
39
40
41 import org.apache.axis.client.*; import javax.xml.namespace.*; import javax.xml.rpc.ParameterMode; public class ClientCompte { public static void main (String [] args) { try{ Service service= new Service (); Call call = (Call)service.createCall(); Call call2 = (Call)service.createCall(); Call call3 = (Call)service.createCall(); String endpoint = "http://localhost:8080/axis/services/CompteService"; call.setTargetEndpointAddress( new java.net.URL(endpoint)); call.setOperationName(new QName(endpoint,"depotDe")); call.addParameter("n1", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN); call.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","int")); Object ajout= call.invoke( new Object[]{100}); call3.setTargetEndpointAddress( new java.net.URL(endpoint)); call3.setOperationName(new QName(endpoint,"retraitDe")); call3.addParameter("n2", new QName("http://www.w3.org/2001/XMLSchema","int"), ParameterMode.IN); call3.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","boolean")); Object retrait= call3.invoke( new Object[]{200}); call2.setTargetEndpointAddress( new java.net.URL(endpoint)); call2.setOperationName(new QName(endpoint,"valeurDuSolde")); Object solde= call2.invoke( new Object[]{}); System.out.println("le solde est de "+ solde); }catch (Exception e) { System.err.println(e.toString()); } } }
Figurez-vous que...ça fonctionne. ( ya eu bcp de temps de passé dessus...)
Ma première question concerne le fait d'avoir incorporé directement dans la méthode retraitDe(int montant) de la classe Compte les commandes de création de service web, d'appel, etc. Est-ce que c'est la seule façon de faire? Est-ce que c'est propre?
Ma seconde question concerne le fait de dupliquer les "Call call = (Call)service.createCall();" pour chaque appel d'une méthode du web service. C'est un peu violent.. N'y a-t-il pas un moyen plus propre de faire ça?
Merci d'avoir lu tout ça et bonne soirée
Partager