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

Langage Java Discussion :

Généricité en Java (complexe)


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 139
    Points : 59
    Points
    59
    Par défaut Généricité en Java (complexe)
    Bonjour à toutes et a tous,

    Je suis face à un probleme que je n'arrive pas a resoudre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public interface Service<T> {
     
    	Iterable<T> findAll();
     
        T find(Long id);
     
        T find(String id);
     
        void delete(Long id);
     
        T createOrUpdate(T object);
     
    }
    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
    import org.springframework.data.repository.CrudRepository;
     
    import model.domain.BDESSecuPk;
     
    public abstract class GenericService<T> implements Service<T> {
     
    	public abstract CrudRepository<T, Long> getRepository();
    	public abstract CrudRepository<T, BDESSecuPk> getRep();
     
    	@Override
        public Iterable<T> findAll() {
            return getRepository().findAll();
        }
     
        @Override
        public T find(Long id) {
            return getRepository().findOne(id);
        }
     
        @Override
        public void delete(Long id) {
            getRepository().delete(id);
        }
     
        @Override
        public T createOrUpdate(T entity) {
            T saved = getRepository().save(entity);
            return saved;
        }
     
    }
    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
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.repository.CrudRepository;
    import org.springframework.stereotype.Service;
     
    import onet.application.dsi.dwrh.model.domain.BDESSecu;
    import model.domain.BDESSecuPk;
    import repository.BDESSecuRepository;
    import service.generic.GenericService;
     
    @Service
    public class BDESSecuService extends GenericService<BDESSecu> {
     
    	@Autowired
        private BDESSecuRepository repository;
     
    	@Override
    	public CrudRepository<BDESSecu, Long> getRepository() {
    		return null;
    	}
     
    	public BDESSecu findByPrimaryKey(BDESSecuPk id){
    		return repository.findById(id);
    	}
     
    	@Override
    	public BDESSecu find(String id) {
    		return null;
    	}
     
    	@Override
    	public CrudRepository<BDESSecu, BDESSecuPk> getRep() {
    		return repository;
    	}
     
    }
    Je voudrai eviter de creer des methodes qui renvoient le type de chaque entite: je m'explique, j'ai plusieurs classes avec des clés composite, et donc quand je crée un class repository je passe la cle composé en parametre pour la classe crudRepository de spring.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import org.springframework.data.jpa.repository.JpaRepository;
     
    import domain.AxeGeneriqueCodeLibelle;
    import domain.AxeGeneriqueCodeLibellePk;
     
    public interface AxeGeneriqueCodeLibelleRepository extends JpaRepository<AxeGeneriqueCodeLibelle, AxeGeneriqueCodeLibellePk> {
     
    }
    J'aimerai utiliser un moyen elegant pour eviter de dupliquer le code (surtout dans la partie service de l'application)
    si vous voyez la methode de cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Override
    	public CrudRepository<BDESSecu, Long> getRepository() {
    		return null;
    	}
    	@Override
    	public CrudRepository<BDESSecu, BDESSecuPk> getRep() {
    		return repository;
    	}
    J'etais obliger de remonter dans la classe GenerciService une methode en plus (getRep()) alors qu'à la base il y'avait juste cette methode getRepository().
    ça ne marche pas parce que le type de cle primaire(cle composé change d'une classe à une autre)
    J'ai pris l'exemple de ces deux methodes que j'ai dupliqué et ça ne s'arrete pas là.
    je dois a vrai dire faire autant de methode que type different (c'est a dire n fois getRepository et n fois le update et n fois le delete et n fois le find etc)
    Cordialement et merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si ton problème est juste le type de clé, ceci devrais faire l'affaire non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public interface Service<T,KEY> {
     
    	Iterable<T> findAll();
     
        T find(KEY id);
     
        T find(String id);
     
        void delete(KEY id);
     
        T createOrUpdate(T object);
     
    }
    Et ton service existant sur du long deviens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Service
    public class BDESSecuService extends GenericService<BDESSecu,Long> {......

Discussions similaires

  1. L'utilité de la généricité de Java
    Par spring.time dans le forum Général Java
    Réponses: 10
    Dernier message: 02/02/2014, 22h16
  2. Généricité développement Java
    Par debloc dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 12/12/2012, 11h01
  3. Comment utiliser la généricité en java ?
    Par Adorien dans le forum Langage
    Réponses: 3
    Dernier message: 27/04/2010, 12h35
  4. Généricité en Java (classe avec paramètre)
    Par epcilone059 dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2009, 12h05
  5. Généricité en java
    Par NewbiZ dans le forum Général Java
    Réponses: 6
    Dernier message: 11/02/2009, 12h27

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