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 :
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 @Repository public class TotoDaoJpaImpl extends GenericDaoJpaImpl<Toto, Long> implements TotoDaoJpa { ... }
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.
Partager