AOP: Interceptar todas las llamadas a mis servicios

25 views
Skip to first unread message

jmbeas

unread,
Nov 6, 2010, 4:25:32 PM11/6/10
to foro-sh
Hola a todos,

Estamos usando Spring 2.5.6 y nos ha surgido la siguiente necesidad:

Nos gustaría sacar a un log todas las llamadas que se hacen a nuestros
servicios (desde nuestras Actions de Struts).

No tenemos muy claro cómo hacer esto. ¿Nos podríais ayudar?
Hemos visto que se podría hacer con aspectos, pero lo cierto es que no
nos queda muy claro cómo.

Muchas gracias,
JMB

Bonvallets

unread,
Nov 6, 2010, 8:06:19 PM11/6/10
to foro-sh
He ocupado spring aop logging en varios proyectos, aca esta bien
explicado http://www.devx.com/Java/Article/30799

Usando annotations me resulto mas elegante. Una idea de como hacerlo
usando el advice Around
y defininedo el PointCut que especifica las llamadas de los metodos
que quieras logear.

@Around("metodos()")
public Object aopLogging(ProceedingJoinPoint joinPoint)
throws Throwable {
Object ret = null;
try {
LOGDELMETODO();
ret = joinPoint.proceed();
} catch (Exception apiEx) {
}
return ret;
}

@Pointcut("execution(* com.servicos.metodos.*(..))")
public void adRemote() { }

José Manuel Beas

unread,
Nov 7, 2010, 10:58:06 AM11/7/10
to foro-sh
Gracias. De momento lo he implementado escribiendo una clase que implementa MethodInterceptor y en el XML lo siguiente:
<bean id="serviceInterceptor" class="com.loquesea.services.ServiceInterceptor" />
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<value>serviceInterceptor</value>
</list>
</property>
<property name="beanNames">
<list>
<value>*SBean</value>
</list>
</property>
</bean>

Me gustaría usar las anotaciones, pero no termino de entender qué debo hacer.

También me gustaría no tener que hacer un MethodInterceptor porque realmente lo que necesito no es escribir "alrededor" sino "antes". Sé que tiene que ver con la anotación @Before, pero ya digo que no he conseguido entender bien qué debo hacer para usar las anotaciones. (Quizás me falta algo en el xml).

Un saludo,
Jose Manuel Beas






2010/11/7 Bonvallets <resp...@gmail.com>
--
Has recibido este mensaje porque estás suscrito al grupo "foro-sh" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a for...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a foro-sh+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/foro-sh?hl=es.


José Manuel Beas

unread,
Nov 7, 2010, 2:25:51 PM11/7/10
to foro-sh
¡Bien, lo conseguí!

Aquí os dejo mi resultado:


import java.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class ServiceInterceptor {

    private Logger log = Logger.getLogger(this.getClass()); 

    @Before("execution(* es.agilismo.pruebas.service.*.*(..))")
public void beforeInvoke(JoinPoint jp) throws Throwable {
if ( log.isDebugEnabled() ) {
log.debug("Before "+claseALaQueLlamamos(jp)+" calling "+metodoAlQueLlamamos(jp)+" with args "+argumentos(jp));
}
}

private String metodoAlQueLlamamos(JoinPoint jp) {
return jp.getSignature().getName();
}

private String claseALaQueLlamamos(JoinPoint jp) {
return ""+jp.getTarget().getClass();
}

private String argumentos(JoinPoint jp) {
return ""+Arrays.asList(jp.getArgs());
}

}


Además, en el applicationContext.xml he tenido que poner:

<aop:aspectj-autoproxy />

declarando por supuesto el espacio de nombres xmlns:aop dejando la cabecera algo así como:

<?xml version="1.0" encoding="UTF-8"?>
xsi:schemaLocation="


Espero les resulte útil.

PS
¿Para cuándo GMail incorporará algo como Snipt.org? ;-)
Reply all
Reply to author
Forward
0 new messages