avril
2008
Récemment, sur un projet JSF sur lequelle je travaille, nous avons remarqué que l’on n’est pas à l’abris d’exception lancée et non récupérée.
Résultat : une belle page d’erreur, avec une stacktrace. Bon, si en développement ce n’est pas génant, ce genre de pages n’est pas fort appréciées en production.
Mais comment faire pour être sur de tout gérer ?
Il serait bien sur possible de faire des try / catch sur les RuntimeException dans toutes les méthodes des beans managés…
Mais, sur notre projet, nous avons la chance de travailler avec une configuration spéciale !
En effet, les beans managés ne sont plus gérés directement par JSF, cette responsabilité étant déléguée à Spring.
Qu’est-ce que cela change me direz vous ? Je vous répondrais : beaucoup de choses !
En effet, du fait de Spring, toutes les fonctionnalités de celui-ci sont apportés au Bean managé : IoC, Déclaration par annotation, et … AOP !
Afin d’être sur de traité tout les exceptions correctement, il suffit de créer un aspect, qui entourera tout les appels aux méthodes publiques.
Si une exception est lancée, alors l’aspect pourra la récupérée, et voir ce qu’elle doit en faire selon son type.
Voici un exemple de cet aspect :
@Aspect public class ExceptionHandler { private String errorOutcome = "exceptionPage"; public void setErrorOutcome(String errorOutcome) { this.errorOutcome = errorOutcome; } @Pointcut("execution(* be.hikage.managed..* (..))") public void publicMethodsInManagedBean() { } @Around("be.hikage.aop.ExceptionHandler.publicMethodsInManagedBean() ") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { try { Object retVal = pjp.proceed(); return retVal; } catch (Throwable throwable) { if (throwable instanceof DirectException) { throw throwable; } else { // Ajout de l'exception dans les attributs de la requête FacesContext context = FacesContext.getCurrentInstance(); NavigationHandler navigation = context.getApplication().getNavigationHandler(); context.getExternalContext().getRequestMap().put("exception", throwable); // Redirection vers la page des erreurs navigation.handleNavigation(context, "", errorOutcome); } } return null; } }
Cet aspect va être exécuté pour toutes les méthodes publiques des beans managés.
Si une exception est lancée par la méthode, alors une vérification est faites. Si c’est une exception de type DirectException ( une classe spécifique à mon application ), alors il suffit de la relancée pour que le traitement se fasse ( appel d’un bean par un autre bean par exemple ).
Sinon c’est une exception de type Runtime ( NullPointerExeption par exemple ), alors au lieu d’affiche une jolie stacktrace, l’utilisateur sera redirigé vers une page de gestion d’erreur ( défini par l’outcome « exceptionPage » ) en ajoutant dans la requête l’exception originale.
Résultat, lorsqu’une erreur n’est pas traitée correctement, une page d’erreur avec le design du site sera affichée
Ce qui fait quand meme plus professionnel !
3 Commentaires + Ajouter un commentaire
Commentaires récents
- SpringSource acquiert Hyperic dans
- Sortie de la huitième béta de SpringSource Application Platform (S2AP) dans
- Sortie de la huitième béta de SpringSource Application Platform (S2AP) dans
- Sortie de la huitième béta de SpringSource Application Platform (S2AP) dans
- Spring One 2008 en direct – Jour 1 dans
Bah obligé … des applications déjà faites à maintenir.
Tu travaille toujours en JSF toi ? Je pensais que t’avais migré vers Wicket ? :]
Hikage, c’est super hyper intéressant ce que tu proposes là ! Bravo et Merci ! Je vais sans le moindre vergogne voler tout ça pour l’utiliser dans mes applications JSF J’espère que tu ne m’en voudras pas trop