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 Discussion :

Petit (ou gros ) problème de genericite


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 64
    Points : 52
    Points
    52
    Par défaut Petit (ou gros ) problème de genericite
    Bonjour,

    Donc voila mon soucis. J'ai une classe FacadeDao qui me sert d'interface entre ma couche Metier et ma couche Dao. J'aimerais que mon interface grâce a une classe Convertisseur puisse Transformer mes classe Metier en Classe Entity (pour le respect du modèle MVC).

    Et la je me suis dit pourquoi ne pas faire quelque chose le plus générique possible :p (pas forcément ma meilleur idée :p).
    Donc dans mon cas j'ai des documents qui peuvent être des livres , ou des cdRom ou pleins pleins d'autre chose. Le but étant de ne pas devoir retaper pleins de code a l'ajout d'une nouvelle classe dans ma hiérarchie.

    Donc pour la classe FacadeDao cela donne :
    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
    package dao.facade;
     
    import javax.ejb.EJB;
    import javax.ejb.LocalBean;
    import javax.ejb.Singleton;
     
    import dao.CrudDao;
    import dao.entity.LivreEntity;
    import metier.Livre;
     
    @Singleton
    @LocalBean
    public class FacadeDao {
     
    	@EJB
    	CrudDao crudDao;
    	@EJB
    	Convertisseur convertisseur;
     
    	public void afficher() {
    		Livre document = new Livre("titre1", "pas peur", 2);
     
    		Livre testE2 = convertisseur.convert(document, LivreEntity.class);
    	}
    }
    Pour la Convertisseur :

    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
    package dao.facade;
     
    import javax.ejb.EJB;
    import javax.ejb.LocalBean;
    import javax.ejb.Singleton;
     
    import dao.entity.LivreEntity;
    import dao.utilitaire.FactoryDao;
     
    @Singleton
    @LocalBean
    public class Convertisseur {
     
    	@EJB
    	FactoryDao factory;
     
    	public <T extends IDocumentConvertible> T convert(T aConvertir, Class<T> type) {
     
    		T resultat = null;
     
    		//if (LivreEntity.class == type) {
     
    		resultat = livreToEntity(aConvertir, type);
    		//}
    		return type.cast(resultat);
    	}
     
     
    	public <T extends IDocumentConvertible> T livreToEntity(T aConvertir, Class<T> type) {
    		LivreEntity entity = (LivreEntity) factory.makeDocumentEntity(type, aConvertir.getCote(),
    				aConvertir.getTitre(), aConvertir.getDescriptif(), aConvertir.getNbExemplaireDispo());
    		entity.setTitre(aConvertir.getTitre());
    		return type.cast(entity);
    	}
    }
    pour la classe FactoryDao

    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
    package dao.utilitaire;
     
    import javax.ejb.LocalBean;
    import javax.ejb.Singleton;
     
    import dao.entity.DocumentEntity;
    import dao.entity.LivreEntity;
     
    @Singleton
    @LocalBean
    public class FactoryDao {
     
    	public <T> T makeDocumentEntity(Class<T> type, int cote, String titre, String description, int nbExemplaire) {
    		if (LivreEntity.class == type) {
    			return type.cast(new LivreEntity(cote, titre, description, nbExemplaire));
    		}
    		if (DocumentEntity.class == type) {
    			return type.cast(new DocumentEntity());
    		}
    		return null;
    	}
    }
    Les Classes Metier et Entity ne font rien de bien spécifique et IDocumentConvertible est une interface.
    L'erreur que j'ai est au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Livre testE2 = convertisseur.livreToEntity(document, LivreEntity.class);
    Il me dit que mes argument ne sont pas bon et que je ne peux envoyer un LivreEntity.class.

    Si quelqu'un a un début de piste je serais vraiment preneur.

    Merci d'avance
    Alexandre

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Salut,

    Ta signature de methode est livreToEntity(T aConvertir, Class<T> type) .

    Donc ton second argument doit etre la classe de ton premier argument. Hors dans ton appelle, la variable document est de type Livre et ta classe que tu passes en second argument est LivreEntity.class
    Cela ne correspond pas.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 64
    Points : 52
    Points
    52
    Par défaut
    Oui pardon j'avais plus ou moins compris le soucis .
    le problème c'est que je ne vois pas trop comment passé outre ?

    c'est a dire passé un Livre et ressortir avec un LivreEntity grâce a une méthode la plus générique possible.

    Merci pour la réponse.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Tu as la possibilite de passer une interface a la place de ton second argument.

    Cette interface pourrait s'appeller IEntityConvertor.java qui possederai une unique methode convert(T)

    Tu crees ensuite une implementation de cette interface LivreEntityConvertor qui override la method convert(Livre livre).
    Cette implementation sera passe a une methode convertToEntity(T objectToConvert, IEntityConvertor convertor) qui sera plus generique que ta methode convertLivreToEntity().
    Cette nouvelle methode appelera simplement la methode create(T) de l'interface que tu as passe en argument.

    J'espere avoir ete claire.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 64
    Points : 52
    Points
    52
    Par défaut
    Oui je penses (Bon a la 10eme relecture un peu moins :p ... mais je boss dessus si cela devient insoluble je te le dirais ^^) ...Merci beaucoup.
    Je test cela dans le week end

    Encore merci

Discussions similaires

  1. [Lecture de FichierXML] <--Gros problème
    Par waldo2188 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/03/2005, 17h15
  2. gros problème id
    Par Sékiltoyai dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/12/2004, 11h53
  3. Gros problème avec la facturation de Tiscali
    Par Harry dans le forum Dépannage et Assistance
    Réponses: 5
    Dernier message: 21/10/2004, 18h55
  4. Gros problème de session/cookies
    Par valfredr dans le forum XMLRAD
    Réponses: 18
    Dernier message: 03/06/2004, 09h21
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

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