SpringAOP:从切入点排除避免最终类和枚举

SpringAOP:从切入点排除避免最终类和枚举,spring,aop,aspectj,spring-aop,Spring,Aop,Aspectj,Spring Aop,我正在尝试使用SpringAOP实现日志记录。我已经定义了 @Pointcut(“执行(*com.mycom.*(…))) 私有void framework(){} @围绕(“框架()”) AdviceFramework(ProceedingJoinPoint jp)周围的公共对象抛出可丢弃{ if(logger.isDebugEnabled()) debug(“debug::{}{}Enter”,jp.getTarget().getClass().getName(),jp.getSignatu

我正在尝试使用SpringAOP实现日志记录。我已经定义了

@Pointcut(“执行(*com.mycom.*(…)))
私有void framework(){}
@围绕(“框架()”)
AdviceFramework(ProceedingJoinPoint jp)周围的公共对象抛出可丢弃{
if(logger.isDebugEnabled())
debug(“debug::{}{}Enter”,jp.getTarget().getClass().getName(),jp.getSignature().getName());
objectreturnval=jp.procedure(jp.getArgs());
if(logger.isDebugEnabled())
debug(“debug::{}{}Out”,jp.getTarget().getClass().getName(),jp.getSignature().getName());
logger.info(“信息::”+jp.getTarget().getClass().getName()+”+jp.getSignature().getName()+“完成:”);
返回值;
}
mycom包及其子包下有很多类。有些类是enum和final类。 正因为如此,我变得

嵌套异常为org.springframework.aop.framework.aopconfigeexception:
无法生成类[class com.mycom.util.BancsServiceProvider]的CGLIB子类:此问题的常见原因包括使用最终类或不可见类;嵌套异常为java.lang.IllegalArgumentException:无法为最终类com.mycom.util.BancsServiceProvider子类
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
是否有一种方法可以使用某种正则表达式从日志记录中排除所有final类和enum类。 注意:我在不同的包中都有枚举类。使用完整的类名很难排除它们


更新2014-11-17(尝试kriegaex的解决方案):

我试着用

@Pointcut(“!in(is(FinalType))”)
但我有以下错误

Pointcut is not well-formed: expecting ')' at character position 10
!!在(is(最终类型))

我在pom文件中添加了这个maven依赖项


org.aspectj
aspectjrt
1.8.4
我还添加了这个maven依赖项


org.aspectj
aspectjweaver
1.8.4

现在,一切都很有魅力。有什么想法,这里发生了什么?

目前,您可以通过AspectJ 1.6.9中引入的
is()
切入点语法排除枚举、方面、接口、内部类型和匿名类型,另请参见我的答案

目前无法通过AspectJ语法排除最终类型。但我认为这是有道理的,所以我为它创建了一个

如何排除枚举:

@Pointcut(“execution(*com.mycom..*(..)&&&&!in(is(EnumType))”)

更新:已发布,另请参见官方网站中的概述。在Maven Central上还没有下载,但我想很快就会有了。如果可用,将是有效的,目前它会产生404错误

那么这个版本为什么有趣呢?因为上面提到的问题已经解决,并且现在有一个新的切入点原语
is(FinalType)
可用,请参阅

现在,您请求的完整解决方案如下所示:

@Pointcut(
“执行(*com.mycom.*(..)&&”+
“!在(is(EnumType))&&”+
“!在(is(FinalType))中”
)

我验证了它的工作原理是这样的。

问题已经解决,AspectJ 1.8.4发布,请参阅更新的答案。我现在尝试得到错误切入点格式不正确:字符位置10处应为“')!在(is(FinalType))中,则不使用1.8.4版进行编译。现在!内部(is(FinalType))工作正常。请阅读编辑后的问题。我不明白你还想知道什么。您正在使用AspectJ 1.8.4中的全新功能,但在构建和运行时依赖项中没有该版本。这真的需要解释吗?现在它正在工作,要快乐。附言:如果你没有以一种方式编辑你的问题,使原来的问题和更新的部分清晰可见,那么很难识别。