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

Spring Java Discussion :

Comportement du find(PrimaryKey pk) quand une entité n'est pas trouvée


Sujet :

Spring Java

  1. #1
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Points : 2 370
    Points
    2 370
    Par défaut Comportement du find(PrimaryKey pk) quand une entité n'est pas trouvée
    Bonjour,

    j'ai un petit soucis concernant la façon dont Spring gère les exceptions par rapport à JPA.
    Voici un extrait de notre DAO générique :

    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
    @Repository
    public abstract class GenericDaoJpaImpl<T, PK> implements GenericDaoJpa<T, PK> {
     
    private static final Logger log = Logger.getLogger(GenericDaoJpaImpl.class);
     
    	protected Class<T> type = null;
     
    	@PersistenceContext
    	protected EntityManager em;
     
    	/**
             * Empty constructor. The real type T is found with generic reflection
             */
    	protected GenericDaoJpaImpl() {
    		this.type = this.getParameterizedType(this.getClass());
    	}
     
    	/**
             * Generic reflection. Find and set generic type used
             */
    	@SuppressWarnings("unchecked")
    	private Class<T> getParameterizedType(Class clazz) {
    		Class<T> specificType = null;
    		ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
    		specificType = (Class<T>) parameterizedType.getActualTypeArguments()[0];
    		return specificType;
    	}
     
    	...
     
    	public T find(PK primaryKey) {
    		log.debug("Recherche ...");
    		T entity = em.find(type, primaryKey);
    		// return em.find(type, primaryKey);
    		if (entity == null) {
    			String msg = "L'entite '" + type + "' avec l'ID '" + primaryKey + "' n'a pas ete trouve...";
    			log.debug(msg);
    			// throw new EntityNotFoundException(msg);
    		}
    		return entity;
    	}
     
    	...
    }



    Et voici un extrait d'un DAO qui hérite du DAO générique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Repository
    public class TotoDaoJpaImpl extends GenericDaoJpaImpl<Toto, Long> implements TotoDaoJpa {
     
    ...
    }
    Et voici un extrait d'une classe métier dans laquelle est injectée le DAO TotoDaoJpa qui hérite du DAO générique :

    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
    public class TotoBusinessImpl implements TotoBusiness {
     
    	private static final Logger log = Logger.getLogger(TotoBusinessImpl.class);
     
    	@Resource
    	private TotoDaoJpa totoDao;	
     
    	@Override
    	public void methodFoo(long totoId)	throws 	NotFoundException {
    		...	
    		Toto toto = null;
    		toto = totoDao.find(totoId);
    		...
     
    		// On n'arrive pas ici si la méthode find ne trouve pas l'entité !
    		if (null == toto)
    		{
    		blabla
    		}
    	}
    	...
    }

    Le problème est que je ne sais pas quelle exception catchée quand la méthode find ne retourne rien, c'est-à-dire que l'entité
    n'est pas trouvé pour l'ID totoId passé en paramètre.
    Une exception (pas vu dans les logs) est lancée mais elle est forcément catchée et gérée par Spring car dès que j'essaie
    d'utiliser ma variable toto dans une couche plus haute j'ai une ClassCastException : java.lang.String cannot be cast to Toto ...

    Quelle est l'exception qui est lancée par Spring quand une entité n'est pas trouvée ?
    EmptyResultDataAccessException ?
    Comment gérer ça proprement ?

    Merci.

  2. #2
    Membre confirmé
    Avatar de Khaled.Noordin
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 354
    Points : 497
    Points
    497
    Billets dans le blog
    1
    Par défaut
    Salut
    Je me suis jamais préoccupé de catcher les exceptions propre à Spring dans le jpa je recherche celle de jpa... par contre ce que je trouve bizarre c'est ta facon d'injecter ton dao dans ton business je me serais plus attendu à un @autowired ou un @inject@qualifierStyle...
    Et pour ta question la reponse c'est null car la javadoc de EntityManager.find dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Returns:
        the found entity instance or null if the entity does not exist
    Donc a ta charge de if toto==null : mon traitement, avant de monter en buziness ou view ou tu crée ton exception avec ton message internationalisé prevu en vue pour un affichage qui va bien.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/09/2008, 15h57
  2. faire un forward quand l'action n'est pas trouvée
    Par newbeewan dans le forum Struts 1
    Réponses: 1
    Dernier message: 07/03/2007, 14h22
  3. Réponses: 3
    Dernier message: 09/05/2006, 18h21
  4. mettre une entité date ou pas??
    Par faayy dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 12/04/2005, 10h00
  5. mettre une entité date ou pas et surtout comment!!!
    Par faayy dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/04/2005, 09h54

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