Spring AOP: excluir evitar clases finales y enumeraciones de pointcut
Estoy tratando de implementar Logging usando Spring AOP. He definido el
@Pointcut("execution(* com.mycom..*(..))")
private void framework() {}
@Around("framework()")
public Object aroundAdviceFramework(ProceedingJoinPoint jp) throws Throwable {
if (logger.isDebugEnabled())
logger.debug("DEBUG:: {} {} Enter", jp.getTarget().getClass().getName(), jp.getSignature().getName());
Object returnVal = jp.proceed(jp.getArgs());
if (logger.isDebugEnabled())
logger.debug("DEBUG:: {} {} Out", jp.getTarget().getClass().getName(), jp.getSignature().getName());
logger.info("INFO:: " + jp.getTarget().getClass().getName() + " " + jp.getSignature().getName() + " Finished:");
return returnVal;
}
Hay muchas clases bajo el paquete mycom y sus subpaquetes. Algunas de las clases son enum y clase final. Debido a esto estoy obteniendo
nested exception is org.springframework.aop.framework.AopConfigException:
Could not generate CGLIB subclass of class [class com.mycom.util.BancsServiceProvider]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.mycom.util.BancsServiceProvider
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
¿Hay alguna manera de excluir todas las clases finales y las clases de enumeración del registro utilizando algún tipo de expresión regular? Nota: Tengo clases de enumeración por todas partes en diferentes paquetes. Sería difícil excluirlos usando nombres de clase completos.
Actualización 2014-11-17 (probando la solución de kriegaex):
Traté de usar
@Pointcut("!within(is(FinalType))")
pero recibo el siguiente error
Pointcut is not well-formed: expecting ')' at character position 10
! dentro (es (FinalType))
He agregado esta dependencia de Maven en el archivo pom
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.4</version>
</dependency>
También he agregado esta dependencia de Maven
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
Ahora, todo funciona a las mil maravillas. Alguna idea, ¿qué está pasando aquí?