Hola a todos, tengo el siguiente problema:

- Por un lado la interface

package mju.ntj.eje.seguridad.dao;
public interface SegUsuarioDao extends GenericDao<SegUsuario, Long> {
}

-  Y su implementación

package mju.ntj.eje.seguridad.dao.hibernate;
public class SegUsuarioDaoImpl extends GenericDaoImpl<SegUsuario, Long> implements SegUsuarioDao {
  public void helloWorld() {}
}

Donde GenericDao y GenericDaoImpl están en un jar externo a Spring

- Tengo el aspecto

package mju.ntj.eje.logging;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LoggingAdvice {
    private final static Logger log = Logger.getLogger(LoggingAdvice.class);
    //@Around("@annotation(Logable)")
    @Around("execution(* mju.ntj.eje.seguridad.dao..*(..))")
    public Object log(ProceedingJoinPoint call) throws Throwable {        
        if (log.isInfoEnabled())
            log.info("=> Entra a " + call.getSignature().getName());
            Object resultado =  call.proceed();            
         if (log.isInfoEnabled())
            log.info("<= Sale de " + call.getSignature().getName());            
            return resultado;
    }    
}

- Y en el application-context.xml

      <aop:aspectj-autoproxy proxy-target-class="true"/>  
      <bean id="loggingInterceptor" class="mju.ntj.eje.logging.LoggingAdvice"/>
      <context:load-time-weaver/>


Con esta configuración los métodos que se declaran en la interfaz

(por ejemplo helloworld()) se interceptan sin problemas, pero los que se extienden de GenericDao no. ¿Cómo puedo hacer para interceptar los métodos de la clase externa de la que extienden?

Gracias por adelantado.

 

 

 

¿Cuál es el paquete de tu GenericDao?

Saludos

El paquete de mi GenericDao es

    mju.ntj.majus.plataformabase.dao

para la interfaz y

     mju.ntj.majus.plataformabase.dao.impl

para la implementación.

 

Salud!

 

El pointcut que estás usando es diferente al paquete de la clase que estás tratando de aplicar el aspecto...

Es por eso que no hace nada ante cierto DAO...

Corrige tu pointcut para que vea el paquete de tu DAO..

Mi pointcut está apuntando a la clase que extiende de GenericDao, que es la que quiero interceptar, no a GenericDao. Además, GenericDao está en un jar externo,  que,  por tanto, Spring desconoce y no podrá interecpetar.

   Mi solución ha sido usar Aspectj en lugar de aop de Spring. Mediante load-time weaving le cargo los paquetes que quiero interceptar (incluyendo a GenericDao) y en el pointcut uso "call" en lugar de "execution", pero apuntando al dao hijo, no al padre.

 Pongo el código por si le sirve de ayuda a alguien:

aop.xml
    <weaver>
        <include within="mju.ntj.majus.plataformabase.dao.*"/>                         
        <include within="mju.ntj.eje..dao..*"/>
    </weaver>
    <aspects>
        <!-- use only this aspect for weaving -->
        <aspect name="mju.ntj.eje.logging.LoggingAdvice" />
    </aspects>  
 </aspectj>

Aspecto:

 

    @Around("call(* mju.ntj.eje..dao..*(..))")
    public Object log(ProceedingJoinPoint call) throws Throwable {
        
         MethodSignature sig = (MethodSignature)call.getSignature();
         String clase = "";
         if (call.getTarget()!=null)
             clase = call.getTarget().getClass().getName();
        
         if (log.isInfoEnabled())
            log.info("=> Entra a " +  clase  + "."+ sig.getName() );

         Object resultado =  call.proceed();
            
         if (log.isInfoEnabled())
             log.info("<= Sale de " +  clase + "."+ sig.getName());
            
         return resultado;
    }    
}

Gracias y un saludo a todos.