исключение может выглядеть следующим образом:
@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;
}
}
}
весны конф:
<!-- 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:
, если вы хотите, чтобы регистратор войти от имени обернутого боба, вы, конечно, можете сделать:
LoggerFactory.getLogger(pjp.getTarget().getClass()).warn("damn!");
или если вы предпочитаете класс объявления этого метода, а не фактический (потенциально проксированный/автоматически сгенерированный тип):
LoggerFactory.getLogger(pjp.getSignature().getDeclaringType()).warn("damn!");
Честно говоря, я не могу оценить влияние на производительность вызова LoggerFactory.getLogger (..) каждый раз. Я бы предположил, что это не должно быть слишком плохо, поскольку исключения являются исключительными (то есть редкими) в любом случае.
Что бы вы достигли, чего у вас еще нет на трассе стека? Если вы планируете регистрировать и проглатывать исключение через аспекты, это звучит для меня довольно плохо. –