2010-12-09 2 views
0

Est-il possible d'appliquer deux conseils AfterThrows au même pointcut restreint par un type d'exception spécifique, à l'exception d'une superclasse de l'autre avec, dans le cas de la sous-classe en cours de capture, un seul conseil en cours d'exécution?Ressort, Aspect J, plusieurs conseils AfterThrowing appliqués au même point

Je veux traduire exécution exceptions (à la fois sur mesure et les standards java) étant jeté hors d'une couche de service, où je fais une traduction spécifique dans certains cas, et un fourre-tout morceau de type de conseils pour traduire quoi que ce soit vraiment inattendu:

 
@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "rnfex") 
public void doTranslationAction(ResourceNotFoundException rnfex) { 
    // throw new WebApplicationException with Status.NOT_FOUND; 
} 

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "aex") 
public void doTranslationAction(AuthorisationException aex) { 
    // throw new WebApplicationException with Status.NOT_AUTHORISED; 
} 

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "throwable") 
public void doTranslationAction(Throwable throwable) { 
    // Log something here about this unexpected exception 
    // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR 
} 

Je trouve que dans ce cas, si je jette une exception qui est explicitement pris en charge alors la bonne méthode est appelée, une exception traduite est lancée, qui est ensuite capturée par le plus large « Throwable 'conseil, puis traduit à nouveau dans le fourre-tout INTERNAL_SERVER_ERROR WAE. Ce n'est pas inattendu, mais pas tout à fait ce que je cherchais. Pour contourner cela, j'ai un seul conseil qui capture tous les types Throwable et utilise ensuite 'instanceof' pour décider s'il s'agit d'une exception d'exécution personnalisée attendue que je peux traduire dans un WAE spécifique ou non.

Si jamais je vois 'instanceof' je suis sûr que j'ai fait quelque chose à avoir honte, mais je ne suis pas sûr s'il y a une meilleure façon de résoudre ce problème sans cela? Je suis également contre la conversion de mes exceptions personnalisées attendues en exceptions vérifiées, puis en attrapant l'exception d'exécution en tant que catch all, ce qui pourrait être une solution.

Répondre

0

J'ai écrit un aspect similaire il y a quelque temps et j'ai fini par utiliser "instance of". Je ne pense pas qu'il y ait un problème avec ça.

0

je ne suis pas assez sûr ... mais juste se demander si votre dernier (troisième) des conseils peut être écrit dans le mode ci-dessous

execution(* com.my.company.api..*(..)) and !execution(* com.my.company.api.XyzAspect..*(..)) 
public void doTranslationAction(Throwable throwable) { 
    // Log something here about this unexpected exception 
    // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR 
} 

où XyzAspect.java est la classe @Aspect où en vous écrivez ces 3 conseils.

Questions connexes