IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

[RMI] Sérialisation d'objets


Sujet :

Java EE

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 4
    Points
    4
    Par défaut [RMI] Sérialisation d'objets
    Bonjour à tous,

    Je vous expose mon problème.
    Alors voila, je suis sous netbeans 7.2, j'ai un projet utilisant des servlets et des jsp afin de récupérer des liste de fichiers appartenant a un login et une adresse ip. J'envoie cette liste de fichier au serveur rmi qui se contente de créer ou modifier un xml via un méthode set.

    Seul souci mon rmi fonctionne correctement lorsque j'envoie des format String mais ne fonctionne pas lorsque j'envoie en plus de cela un tableau de fichier.

    Un fichier est une classe utilisable sur le serveur et sur le client donc je l'ai serializé.

    Je sèche sur ce problème depuis 3 jours et je n'arrive pas à le résoudre malgré mes différentes recherches sur netbeans.

    Mon registery est lancé manuellement côté serveur via un createRegistry sur le port 1099. (Je ne vois jamais de stub créer même lorsque cela fonctionne ce qui est tout à fait normal d'après les dernières versions de netbeans( depuis la 6).

    J'ai cherché du côté du security Manager qui importe les classes demandés dynamiquement mais je pense que je prend une mauvaise route en cherchant de ce côté puisque je pense que le problème est beaucoup plus basiques.( Peut être un problème de multi cast mais je n'en suit pas sur).

    Voici le type de mon exception :

    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.net.MalformedURLException: no protocol: and

    Merci de vos réponses.

    Cordialement,

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Il faudrait que nous donne un peu de code. A minima :
    - Ta classe fichier
    - L'endroit où ça te sort cette exception

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Très bien, Alors voici ma classe fichier :

    Une classe simple, un fichier possèdent un type et un nom
    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
     
    package client;
     
    import java.io.Serializable;
     
    public class Fichier implements Serializable{
     
        private String nom;
        private String type;
     
        public Fichier(){}
     
        public Fichier(String nom,String type)
        {
    	this.nom=nom;
    	this.type=type;
        }
     
        public String getNom()
        {
    	return this.nom;
        }
     
        public String getType()
        {
    	return this.type;
        }
     
        public void Afficher()
        {
    	System.out.println("\nNom du Fichier: "+ this.getNom() );
    	System.out.println("Type du fichier: " +this.getType()+"\n\n");
        }
    }

    Ensuite voici la servlet ou je vais donc récupérer mon objet déposer sur le serveur qui possède pour l'instant une méthode setXml() dans laquelle je ne fait qu'écrire du texte pour le moment.


    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
     
     try{
                    Registry registry = LocateRegistry.getRegistry("127.0.0.1",1099);     
     
                    BoiteImpl b = (BoiteImpl) Naming.lookup("ref");
                    String login = (String) session.getAttribute("login");
                    String adresse =  (String) session.getAttribute("adresse");
     
                b.setXml("liste.xml",login,adresse,tab);          
     
    out.println(login + adresse);
     
     
               }
               catch(NotBoundException e){
    	         System.out.println("Erreur1"+e);
    	    }catch(RemoteException e){
    	         System.out.println("Erreur2"+e);
    	    }catch(MalformedURLException e){
    	         System.out.println("Erreur3"+e);
    	    }
    Mon println ne fonctionne pas donc il 'y a un problème au niveau au dessus. C'est ici que l'exception est ressortit dans le deuxième catch Erreur2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Erreur2java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    	java.net.MalformedURLException: no protocol: and
    Et enfin voici le code de mon 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
     
     
    import java.io.IOException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
     
    public class Serveur{
     
     
        public static void main(String[]args) throws IOException{
    	try{
     
    	     Boite b = new Boite();
    	     Registry registry = LocateRegistry.createRegistry(1099);
    	     registry.rebind("ref",b);
     
     
    	     System.out.println("Objet OK");
    	}
    	catch(Exception e) {}
        }
    }

    Ma méthode setXml possèdent un String nom du fichier xml,login , ip et un tableau de fichier . Lorsque j’enlève ce tableau de fichier, tout fonctionne correctement.

    Je modifie mon post car j'ai modifiée l'arborescence de mon projet.

    Je navigue sur le net, et je trouve continuellement des références aux java.codebase mais je n'arrive pas a comprendre ce que c'est et en quoi cela est lié à mon problème.

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Tu peux rajouter qqchose dans le catch coté serveur ?
    Parce que là tu as une erreur sur le client qui te dit que l'erreur s'est en fait produite sur le serveur. Le mieux pour debug serait d'avoir l'exception côté serveur ce qui nous donnerait la ligne de code serveur qui fait planter. Parce que là honnêtement, comme ça, je ne vois rien d'incorrect.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    catch(Exception e){
    	         System.out.println("Erreur6"+e);
    	    }
    Voici ce que j'ai ajouté du côté serveur et rien ne s'affiche du côté serveur dans tous les cas le "Objet OK" s'affiche.

    Donc cela me paraît bizarre que ça vienne du serveur.

    D'après plusieurs recherches un problème de path est effectif sous netbeans.
    Car le path n'accepte pas d'espaces ce qui génère une exception non résolut par suns.

    Mais personne ne dit comment résoudre ce problème et si cela était vraiment un problème pourquoi alors tout se déroulerai correctement lorsque j’enlève le paramètre " tableau de fichier".

    Je suis complétement perdu, je ne voit pas d’où ça vient. Car sous linux, tout compile bien du côté rmi.

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Et bien j'avance dans la résolution de mon problème apparemment ce n'est pas un problème ni entre le client, ni entre le serveur: voici les lignes qui bug :


    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
     
    Fichier tab[] = new Fichier[4];
                    for(int i =0; i< nb ;i++)
                    {
                        //Adresse du fichier 
                        String num = String.valueOf(i);
                        nombre = nombre.concat(num); 
                        adresse_fichier[i]= (String) request.getParameter(nombre);
                        // on stocke le nom de fichier sans le debut si on a totu le chemin
     
                        //On stocke le type de chaque fichier
                        String str[]=adresse_fichier[i].split("\\.");
                       // type_fichier[i]= str[1];
     
                        //On créer notre tableau de fichier
                        Fichier tmp = new Fichier(adresse_fichier[i],"yoyo");//type_fichier[i]);
                        tab[i] = tmp; 
                    }

    Lorsque j'attribue la valeur null à Fichier tab[], tout marche, je ne comprend toujours pas pourquoi.

    J'ai aussi essayer de créer un objet appeler Tableau_Fichier qui contient le tableau de fichier serializable mais rien n'y fait, l'exception est toujours présente. Si quelqu'un à une idée.

    Merci encore pour vos réponses

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonsoir,

    A mon humble avis, le problème vient de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoiteImpl b = (BoiteImpl) Naming.lookup("ref");
    D'une part, la javadoc indique qu'il faut passer une URL du style //host:port/objectName.
    D'autre part, il est dommage de rechercher l'interface de Registry sans l'exploiter directement.
    Réécris ton code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Registry registry = LocateRegistry.getRegistry("127.0.0.1",1099);     
     
                    BoiteImpl b = (BoiteImpl) registry.lookup("ref");
    Une fois ceci fait, dis-nous si tu as toujours la MalformedURLException.

    Cordialement,
    Sébastien

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Oui je suis désolé, c'est une erreur que j'ai fait puisque j'ai envoyé le post depuis la fac et j'ai réessayé sur leur machine afin de savoir si le problème ne venait pas de ma configuration, du coup j'ai fait ça assez vite.

    Je suis actuellement chez moi et je confirme que je n'ai pas fait cette erreur ici, j'ai bien lookup sur le registery que je recherche auparavant.

    Chez moi l'exception est plus détaillé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Erreur2icijava.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    	java.net.MalformedURLException: no protocol: Files/glassfish-3.1.1/glassfish/domains/domain1/generated/project/
    Et j'ai malheureusement toujours la même erreur, je vient de récupérer la partie rmi de ce projet, et j'ai réussit à la faire marcher correctement sous linux en ligne de commande et sous netbeans avec un projet java externe entièrement consacré au rmi.

    Donc je me pose la question suivante, est-ce que je fait bien le mélange servlet et rmi?

    Ma servlet doit agir comme un client normalement, donc il ne doit y avoir aucun problème si le code ci-dessus du client est mis dans la méthode processRequest de la classe creer_liste?

    D'après ce que je comprend, c'est lorsque j'utilise les deux que mon problème survient.

    Je désespère mais j’espère y arriver !

Discussions similaires

  1. Sérialisation d'objets sans Boost
    Par Alp dans le forum Boost
    Réponses: 7
    Dernier message: 24/09/2006, 11h43
  2. [POO] Sérialisation d'objet en PHP
    Par Invité(e) dans le forum Langage
    Réponses: 4
    Dernier message: 29/08/2006, 15h37
  3. Sérialisation d'objets en c++
    Par OxyLin dans le forum C++
    Réponses: 9
    Dernier message: 13/02/2006, 22h50
  4. [C#] Comment sérialiser un objet Font ?
    Par djmanu dans le forum C#
    Réponses: 5
    Dernier message: 20/01/2006, 09h51
  5. [Sérialisation] d'objets de types différents
    Par Amnesiak dans le forum Général Java
    Réponses: 3
    Dernier message: 08/12/2004, 22h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo