un aspecto de excepción podría verse así:
@Aspect
public class ExceptionAspect {
private static final Logger log = LoggerFactory.getLogger(ExceptionAspect.class);
public Object handle(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed();
} catch (Throwable t) {
// so something with t: log, wrap, return default, ...
log.warn("invocation of " + pjp.getSignature().toLongString() + " failed", t);
// I hate logging and re-raising, but let's do it for the sake of this example
throw t;
}
}
}
primavera conf:
<!-- log exceptions for any method call to any object in a package called 'svc' -->
<bean class="org.example.aspects.ExceptionAspect" name="exceptionAspect" />
<aop:config>
<aop:aspect ref="exceptionAspect">
<aop:around method="handle" pointcut="execution(* org.example..svc..*.*(..))" />
</aop:aspect>
</aop:config>
EDIT:
si desea que el registrador para iniciar la sesión en nombre del grano envuelto, usted podría, por supuesto, hacer:
LoggerFactory.getLogger(pjp.getTarget().getClass()).warn("damn!");
o si Prefiere la clase de declaración de este método en lugar de la real (potencialmente proxiado/tipo autogenerado):
LoggerFactory.getLogger(pjp.getSignature().getDeclaringType()).warn("damn!");
Honestamente, no puedo estimar las implicaciones de rendimiento de llamar a LoggerFactory.getLogger (..) cada vez. Supongo que no debería ser tan malo, ya que las excepciones son excepcionales (es decir, raras) de todos modos.
¿Qué significaría esto que aún no tiene de un rastro de pila? Si planeas iniciar sesión y tragar la excepción a través de aspectos, eso me parece una idea bastante mala. –