logging - springboot - Aspectc pointcuts: obtenga una referencia a la clase y el nombre de joinpoint
spring-boot-starter-aop (2)
Estoy usando el estilo @AspectJ para escribir aspectos, para manejar el registro en nuestra aplicación. Básicamente tengo un punto de corte configurado así:
@Pointcut("call(public * com.example..*(..))")
public void logging() {}
Y luego un consejo antes y después como este:
@Before("logging()")
public void entering() {...}
...
@After("logging()")
public void exiting() {...}
Quiero crear un registro en estos métodos en el siguiente formato:
logger.trace("ENTERING/EXITING [" className + "." + methodName "()]");
El problema es que no sé cómo obtener una referencia a los nombres de clase y método. Yo he tratado:
joinPoint.getThis().getClass()
pero esto parece devolver el nombre de clase de la persona que llama.
class A {
public void a() {
B.b();
}
}
class B {
public void b() {
...
}
}
resultaría en el siguiente registro
ENTERING [A.b()]
¿Alguien puede dar alguna ayuda sobre cómo obtener la clase de joinpoint real y el nombre del método?
joinPoint.getTarget().getClass()
utilizar joinPoint.getTarget().getClass()
. Como está utilizando el aviso de un punto de unión de llamada, el objetivo de su interés es el objetivo de la llamada.
Tenga en cuenta que la especificación de la API indica :
Devuelve el objeto de destino. Este será siempre el mismo objeto que coincidió con el designador de corte de punto de destino. A menos que necesite específicamente este acceso reflexivo, debe usar el designador de corte de punto de destino para obtener este objeto para una mejor escritura y rendimiento estáticos.
Devuelve nulo cuando no hay ningún objeto de destino.
El uso joinPoint.getTarget().getClass()
puede dar como resultado una NullPointerException
. Considere usar la firma del punto de unión, como por ejemplo:
final Signature signature = joinPoint.getSignature();
Entonces:
final Class clazz = signature.getDeclaringType();
O si todo lo que necesitas es el nombre de la clase:
final String clazz = signature.getDeclaringTypeName();
public void logBefore(JoinPoint joinPoint) {
logger.info("###### Requested class : {} ; Method : {} ", joinPoint.getTarget().getClass().getName(), joinPoint.getSignature().getName());
Object[] signatureArgs = joinPoint.getArgs();
for (Object signatureArg : signatureArgs) {
logger.info("###### Arguments: {} ", signatureArg.toString());
}
}
puede ayudar a alguien: use el código anterior para obtener la Clase, el método y los argumentos solicitados.