Bonjour à tous,

Je viens de débuter avec RMI. J'ai crée dans projet Play un serveur simple qui renvoi la date actuel et un client qui l'affiche.

Quand je lance le serveur et le client depuis des lignes de commandes, j'obtiens le résultat souhaité. J'ai bien la date qui est affichée.

Cependant, quand j'essaye de récupérer cette donnée depuis une fonction de la class Applications pour l'afficher dans une page web, la méthode me renvoi cette erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: controllers.srvEcho_Stub (no security manager: RMI class loader disabled)
Afin de mieux exposer mon problème, voici mon code :

---- Interface Serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public interface interEcho extends Remote{
 
	public Date echo() throws RemoteException;
 
}
------- Class : Serveur
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
44
45
46
47
48
49
50
51
52
 
public class srvEcho extends UnicastRemoteObject implements interEcho{
 
	protected srvEcho() throws RemoteException {
		super();
	}
 
	private static final long serialVersionUID = 1L;
 
 
	public Date echo() throws RemoteException {
		return new Date();
	}
 
	//*Pour lancer le serveur depuis le Terminal
	public static void main (String arg[]){
 
		if (System.getSecurityManager() == null) {
		      System.setSecurityManager(new RMISecurityManager());
		}
 
		try {
			srvEcho serveurEcho = new srvEcho();
			Naming.rebind("srvEcho", serveurEcho);
			System.out.println("Le serveur et pret");
		} catch (Exception e) {
			System.out.println("Erreur !! \n\n\t"+e.toString());
		}
	}
	//*/
 
	//* Pour lancer la serveur depuis une fonction
	public static String Lancer (){
 
		String rep = new String("Rep Serv : ");
 
		if (System.getSecurityManager() == null) {
		      System.setSecurityManager(new RMISecurityManager());
		}
 
		try {
			srvEcho serveurEcho = new srvEcho();
			Naming.rebind("srvEcho", serveurEcho);
			System.out.println("Le serveur et pret");
			rep += "Le serveur et pret";
		} catch (Exception e) {
			System.out.println("Erreur !! \n\n\t"+e.toString());
			rep += "Le serveur et pret";
		}
 
		return rep;
	}
----- Class : client
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
 
public class cltEcho {
 
	public cltEcho(){}
 
	public static String getInfo(){
 
		String message = new String("Reponse :");
		String urlService=new String("rmi://localhost/srvEcho");
		//String urlService=new String("rmi://Dev/Projets/play/test-RMI_Server/tmp/classes/controllers/srvEcho");
		interEcho serveur=null;
 
		try{
			// localisation du service
			serveur=(interEcho) Naming.lookup(urlService);
			// boucle de lecture des msg à envoyer au serveur d'écho
			Date date = (Date) serveur.echo();
			message += date;
			System.out.println("la reponse est: "+date);
			} 
		catch (Exception e){
			System.err.println("Erreur : " + e);
			message += "Erreur : " + e.toString();
		}//try
 
		return message;
	}
 
}
----- Class : Applications
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
public class Application extends Controller {
 
    public static void index() {
    	render();
    }
 
    public static void affiche() {
    	cltEcho cl = new cltEcho();
		String message = cl.getInfo();
    	render(message);
    }
}

mes étapes d’exécution:
- je démarre mon application play
- une fois les fichiers compiler je génère le srvEcho_Stub dans le meme répertoire (tmp/classes/controllers/)
- je lance la commande rmiregistry
- je lance le serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
java -Djava.security.policy=controllers/mypolicy -Djava.rmi.server.codebase=file:C:/Dev/Projets/play/test-RMI_Server/tmp/classes/ controllers.srvEcho
-le resultat obtenu en exécutant la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public static void affiche() {
    	cltEcho cl = new cltEcho();
		String message = cl.getInfo();
    	render(message);
}
est l’exception mentionnée.

Je note que les classes sont dans le même package controllers
et si j’exécute je client depuis une ligne de commande j'ai le bon résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
C:\Dev\Projets\play\test-RMI_Server\tmp\classes>java controllers/cltMain
la reponse est: Wed Apr 11 14:56:00 CEST 2012
Reponse :Wed Apr 11 14:56:00 CEST 2012
avez-vous une idée ?
Merci,