2010-12-09 4 views
0

Ist es möglich, dass zwei AfterThrows Ratschläge auf denselben Punkt angewendet werden, der durch einen bestimmten Ausnahmetyp eingeschränkt ist, wobei eine Ausnahme eine Oberklasse des anderen ist Fall der Unterklasse wird erfasst, nur ein Rat wird ausgeführt?Spring, Aspect J, mehrfacher AfterThrowing - Ratschlag für den gleichen Punkteschnitt

Ich möchte Laufzeit Ausnahmen (sowohl benutzerdefinierte und Standard-Java-Einsen) aus einer Service-Schicht, wo ich eine bestimmte Übersetzung in bestimmten Fällen und dann eine Catch-all Art von Ratschlag zu übersetzen übersetzen wirklich unerwartet etwas:

 
@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 
} 

finde ich, dass in diesem Fall, wenn ich eine Ausnahme aus, die explizit für dann die richtige Methode ist gesorgt genannt wird, eine übersetzte Ausnahme ausgelöst wird, die dann durch den breiteren ‚Throwable erfaßt 'Beratung, dann wieder übersetzt in den Catch-All INTERNAL_SERVER_ERROR WAE. Das ist nicht unerwartet, aber nicht ganz das, wonach ich gesucht habe.

Um dies zu umgehen, habe ich einen einzigen Ratschlag, der alle Throwable-Typen erfasst und dann 'instanceof' verwendet, um zu entscheiden, ob dies eine erwartete benutzerdefinierte Laufzeitausnahme ist, die ich in eine bestimmte WAE übersetzen kann oder nicht.

Wenn ich jemals 'instanceof' sehe, bin ich sicher, dass ich etwas getan habe, für das ich mich schäme, aber ich bin mir nicht sicher, ob es einen besseren Weg gibt, dieses Problem zu lösen.

Ich bin auch gegen die Umwandlung meiner erwarteten benutzerdefinierten Ausnahmen in geprüfte Ausnahmen und dann fangen Runtime-Ausnahme als den Catch all, was eine Lösung sein könnte.

Antwort

0

Ich schrieb einen ähnlichen Aspekt vor einer Weile und ich endete mit "Instanz von". Ich glaube nicht, dass es ein Problem damit gibt.

0

ich bin nicht ganz sicher ... aber nur fragen, ob Ihre letzte (dritte) Beratung kann

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 
} 

wo XyzAspect.java ist die @Aspect Klasse in der unten Art und Weise geschrieben werden, wo in Sie zu schreiben sind, diese 3 Ratschläge.

Verwandte Themen