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

avec Java Discussion :

classe générique pour mes facades


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 226
    Points : 72
    Points
    72
    Par défaut classe générique pour mes facades
    bonjour,

    j'aimerais utiliser des générique pour éviter de toujours ecrire le meme code mais j'ai quelque souci :

    voici ce que j'ai penser a crée :
    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
     
    public abstract class AbstractCore<E,F> {
         private Class<E> entityClass;
         private Class<F> facade;
     
       protected abstract F getEntityManager();
     
        public void Cree(E entity)  {
            facade.create(entity);
        }
     
         public List<E> allObject(){
     
            return facade.findAll();
        }
     
        public Civilite ObjectbyID(Object id){
           return facade.find(id);
        }
        public void Modifier(E entity){
            facade.update(entity);
        }
    }

    car pour le moment j'ai les méthodes suivante :


    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
     
    public class CiviliteCore implements CiviliteInterface   {
     
        private CiviliteFacade civiliteFacade = new CiviliteFacade();
     
        public CiviliteCore() {
        }
     
        public void Cree(Civilite civilite)  {
     
           civiliteFacade.create(civilite);
        }
     
        public List<Civilite> allObject(){
     
            return civiliteFacade.findAll();
        }
     
        public Civilite ObjectbyID(Civilite civilite){
           return civiliteFacade.find(civilite.getKeyCivilite());
        }
        public void Modifier(Civilite civilite){
            civiliteFacade.update(civilite);
        }
     
    }
    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
     
    public class TypeContactCore implements TypeContactInterface {
     
        private  TypeContactFacade typeContactFacade = new TypeContactFacade();
        @Override
        public void Cree(TypeContact typeContact) {
            typeContactFacade.create(typeContact);
        }
     
        @Override
        public List<TypeContact> allObject() {
           return typeContactFacade.findAll();
        }
     
        @Override
        public TypeContact ObjectbyID(TypeContact typeContact) {
          return  typeContactFacade.find(typeContact.getKeyTypeContact());
        }
     
        @Override
        public void Modifier(TypeContact typeContact) {
            typeContactFacade.update(typeContact);
        }
     
    }

    facade extends tous

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    package fr.ietevents.serviceweb.Facades;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    import java.util.List;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityTransaction;
     
    /**
     *
     * @author Coshom
     */
    public abstract class AbstractFacade<T> {
     
        private Class<T> entityClass;
        final String urlDB = "fr.ietevents_ServiceWeb_war_1.0-SNAPSHOTPU";
     
        public AbstractFacade(Class<T> entityClass) {
            this.entityClass = entityClass;
        }
     
        protected abstract EntityManager getEntityManager();
     
        public void create(T entity) {
            EntityManager em = getEntityManager();
            EntityTransaction tx = em.getTransaction();
            //System.out.println( "Début de la transaction");
            tx.begin();
            try {
                //  System.out.println( "Ajout du client dans la base en cours..." );
                em.persist(entity);
                em.flush();
                em.refresh(entity);
                tx.commit();
                //  System.out.println( "Transaction validée");
            } catch (Exception e) {
                System.out.println("Erreur :" + e.getMessage());
                tx.rollback();
     
            } finally {
     
                em.close();
     
            }
     
        }
     
        public void update(T entity) {
            EntityManager em = getEntityManager();
            EntityTransaction tx = em.getTransaction();
     
            tx.begin();
            try {
     
                em.merge(entity);
                em.flush();
                tx.commit();
            } catch (Exception e) {
                System.out.println("Erreur :" + e.getMessage());
                tx.rollback();
     
            } finally {
                em.close();
     
            }
     
        }
     
        public void remove(T entity) {
            getEntityManager().remove(getEntityManager().merge(entity));
        }
     
        public T find(Object id) {
            return getEntityManager().find(entityClass, id);
        }
     
        public List<T> findAll() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(entityClass));
            return getEntityManager().createQuery(cq).getResultList();
        }
     
        public List<T> findRange(int[] range) {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(entityClass));
            javax.persistence.Query q = getEntityManager().createQuery(cq);
            q.setMaxResults(range[1] - range[0]);
            q.setFirstResult(range[0]);
            return q.getResultList();
        }
     
        public int count() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
            cq.select(getEntityManager().getCriteriaBuilder().count(rt));
            javax.persistence.Query q = getEntityManager().createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        }
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void Cree(E entity)  {
            facade.create(entity);
        }
    Pour pouvoir appeler une méthode create() sur la variable facade, il faut que cette variable soit d'une classe qui a cette méthode. Or, la classe Class n'a pas cette méthode (et pas plus Class<F> ou Class<BIDULE>...).

    Il faut que ta variable facade soit de type F, et que le type paramétré F soit d'un type qui étend AbstractFacade :

    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 Exemple<E, F extends AbstractFacade<E>> {
     
            private F facade;
     
            public Exemple(F facade) {
                  this.facade=facade;
            }
     
            public void create(E entity) {
                  facade.create(entity);
            }
     
    ]

    Class<F> n'est utile que si tu as besoin de manipuler la classe elle-même (pour créer des instances de cette classe par exemple, faire de l'introspection en général...)

    Pas sûr que cela soit vraiment une facade ton AbstractFacade (une façade est un regroupement de plusieurs interfaces (de classe) dans une seule, comme par exemple MouseAdapter, qui combine MouseListener, MouseMotionListener et MouseWheelListener), mais une sorte de pool/factory, il me semble.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 226
    Points : 72
    Points
    72
    Par défaut
    un grand merci .

    je me demandais si il était possible de généraliser ceci vu qu'il sera commun pour toutes les tables :

    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
     
     
    @Path("/secured/civilite")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public class CiviliteService {
     
        private CiviliteCore civiliteCore = new CiviliteCore();
     
        @GET
        public Response getAllCivilite(){ 
            List<Civilite> lCivilite = civiliteCore.allObject();
            return Response.ok(lCivilite.toArray(new Civilite[lCivilite.size()]) )
                   .build();
        }
     
        @GET
        @Path("{id}")
        public Response getCiviliteByID(@PathParam("id")int id ){
          Civilite civilite = new Civilite();
          civilite = civiliteCore.ObjectbyID(id);
          return Response.ok(civilite).build();
        }
     
        @POST
        public Response creeCivilite(Civilite civilite,@Context UriInfo uriInfo){
        civiliteCore.Cree(civilite);
        URI absoluteURI = uriInfo.getBaseUriBuilder().path("/civilite/"+civilite.getKeyCivilite()).build();
        return  Response.created(absoluteURI).build();
       }
     
        @PUT
        public Response ModifierCivilite(Civilite civilite){
            civiliteCore.Modifier(civilite);
            return Response.ok().build();
     
        }
     
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 226
    Points : 72
    Points
    72
    Par défaut
    bonjour,

    avec le code suivant :

    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 abstract class AbstractService <E,C extends AbstractCore>  {
     
     
         protected abstract C getCore();
     
        @GET
        public Response getAllEntity(){ 
            List<E> lEntity = getCore().allObject();
            return Response.ok(lEntity.toArray(new E[lEntity.size()]) )
                   .build();
        }
     
     
        @POST
        public Response creeEntity(E entity,@Context UriInfo uriInfo){
        getCore().Cree(entity);
        URI absoluteURI = uriInfo.getBaseUriBuilder().path("/entity").build();
        return  Response.created(absoluteURI).build();
       }
     
        @PUT
        public Response ModifierCivilite(E entity){
           getCore().Modifier(entity);
            return Response.ok().build();
     
        }
     
    }
    j'ai un souci au niveau des générique suivant :

    return Response.ok(lEntity.toArray(new E[lEntity.size()]) ) .build();

    pouvez-vous m'aider?


    Merci d'avance

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/01/2014, 12h24
  2. [XML] Classe générique pour analyser toute forme de fichier XML
    Par stomerfull dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 14/01/2010, 08h26
  3. Classe générique pour simplifier l'utilisation des fichiers
    Par Oprichnik dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 10
    Dernier message: 09/08/2007, 23h15
  4. Réponses: 3
    Dernier message: 05/10/2006, 17h15
  5. Réponses: 7
    Dernier message: 11/04/2005, 22h23

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