RMI Erreur

cs_nosferaptus Messages postés 5 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 4 avril 2010 - 4 avril 2010 à 03:42
cs_nosferaptus Messages postés 5 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 4 avril 2010 - 4 avril 2010 à 14:40
Bonsoir tout le monde,
Mon problème est le suivant : j'utilise les RMI et je rencontre cette erreur:
"java.lang.ClassCastException: $Proxy0 cannot be cast to client.IClassDao"
je ne trouve pas de solution alors j'ajoute le jar du projet serveur comme bibliothèque pour le Client et je ne déclare pas une Interface mai j'utilise celle existante dans le jar dans ce cas ça marche mais par contre ça m'affiche une autre erreur :
"java.lang.NullPointerException"
je vous passe mon code en espérant que vous puissiez m'aidez

Code de l'interface IClassDao :

package serveur.DAO;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import serveur.persistance.Classe;

public interface IClassDao extends Remote{

public void persist(Classe c) throws RemoteException;
public void update(Classe c) throws RemoteException;
public void delete(Classe c) throws RemoteException;
public Classe findById(String id) throws RemoteException;
public List<Classe> findAll() throws RemoteException;
}

****************************************************************
Code de l'implémentation de l'interface ClassDao :

package serveur.DAO;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;
import serveur.persistance.Classe;

public class ClassDao extends UnicastRemoteObject implements IClassDao{

private static ClassDao instance;

private ClassDao() throws RemoteException{}

public static ClassDao getInstance() throws RemoteException{
if(instance==null)
instance=new ClassDao();
return instance;
}

public void persist(Classe c) throws RemoteException{
Utility.setPu("ServeurPU");
Utility.getEntityManager().getTransaction().begin();
Utility.getEntityManager().persist(c);
Utility.getEntityManager().getTransaction().commit();
}

public void update(Classe c) throws RemoteException{
Utility.getEntityManager().merge(c);
}

public void delete(Classe c) throws RemoteException{
Classe cl=Utility.getEntityManager().find(Classe.class,c.getIdC());
Utility.getEntityManager().remove(cl);
}

public Classe findById(String id) throws RemoteException{
return Utility.getEntityManager().find(Classe.class,id);
}

public List<Classe> findAll() throws RemoteException{
return (List<Classe>) Utility.getEntityManager().createQuery("SELECT c FROM Classe c").getResultList();
}

}

****************************************************************
Code du lancement Serveur :

package serveur;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import serveur.DAO.*;
import serveur.persistance.Classe;

public class Main {

public static void main(String[] args) {
try{
java.rmi.registry.LocateRegistry.createRegistry(1099);
System.setProperty("java.security.policy", "\\java.policy");
if (System.getSecurityManager() == null)
System.setSecurityManager ( new RMISecurityManager() );


ClassDao c=ClassDao.getInstance();
String url = "rmi://127.0.0.1//ClassDao";
Naming.bind(url, c);
System.out.println("Serveur en écoute ....");
}catch(Exception e){
System.out.println("Erreur !!!!!!");
e.printStackTrace();
}
}
}

****************************************************************
Code du Client :

package client;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import serveur.DAO.IClassDao;
import serveur.persistance.Classe;

public class Main {

public static void main(String[] args) {

IClassDao ic=null;
Classe c=new Classe();
c.setIdC("sss");
c.setClassNum("aaa");

try{
System.setProperty("java.security.policy", "\\java.policy");
if (System.getSecurityManager() == null)
System.setSecurityManager ( new RMISecurityManager() );

String url = "rmi://127.0.0.1//ClassDao";
ic= (IClassDao) Naming.lookup(url);
ic.persist(c);

}catch(Exception e){
System.out.println("Erreur !!!!!!");
e.printStackTrace();
}
}
}

mon fichier java.policy contient :
grant{
permission java.security.AllPermission;
};

2 réponses

cs_nosferaptus Messages postés 5 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 4 avril 2010
4 avril 2010 à 05:35
Bon voilà c'est fais c'est réglé le truc est que les données que je voulais persister existent déjà dans la base (problème de clé primaire)
0
cs_nosferaptus Messages postés 5 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 4 avril 2010
4 avril 2010 à 14:40
maintenant j'ai un autre problème:
quand je lance un "FindAll" via le client une exception est levée :
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
        java.lang.ClassNotFoundException: org.hibernate.collection.PersistentBag

pourtant j'ai changé le type de retour de cette méthode :
public Vector<Classe> findAll() throws RemoteException{
        Vector<Classe> v=new Vector<Classe>();
        List<Classe> l;
        l=(List<Classe>) Utility.getEntityManager().createQuery("SELECT c FROM Classe c").getResultList();
        for(int i=0;i<l.size();i++)
            v.add(l.get(i));
        return v;
    }

puisque la classe "Vector" est "Serializable" contrairement à une "List"

de même pour le "FindById" qui est une méthode qui retourne un objet de type "Classe" donc je l'ai modifié pour que le type de retour soit un type primitif (String) et là ça marche !!!
c'est quoi la façon par laquelle je peut récupérer tout l'objet classe par une méthode et non pas un attribut à la fois ?
0
Rejoignez-nous