简单AOP示例上不支持PointcutPrimitiveException



我尝试在这个站点中运行一个简单的aop示例。我有spring-aop和aspectj,aspectjweaver jars:

@Aspect
public class StringAspect {
    @Pointcut("call(* String.toLowerCase())")
    public void toLowerCasePointcut() {}
    @Around("toLowerCasePointcut()")
    public String toLowerCaseAroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        String text = ((String) joinPoint.getTarget()).toUpperCase();
        return text;
    }
}

当我在Test.java中像"AaBbCc".toLowerCase((一样运行这个例子时,我得到了这个异常;

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean ... Initialization of bean failed; nested exception is org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException: Pointcut expression call(* String.toLowerCase()) contains unsupported pointcut primitive 'call'

Spring AOP不包含"调用",但为什么aspectj编织不起作用,你有想法吗?非常感谢。

编辑:

在我的spring-config文件中,我只有@saspect注释类和<aop:aspectj-autoproxy />的bean定义。我的罐子是:spring-op-3.0.5,aopalliance,aspectjrt1.6.8,aspectjweaver1.50

您是否尝试过使用AspectJ Eclipse插件进行编织?(它也包含在SpringSource工具套件中(

如果您的Spring配置中有一些方面配置。试着删除它,只在项目中启用AspectJ性质。还要删除所有AspectJjar文件,只使用插件自动附加的文件。

有了这个设置,它至少对我有效。

更新:将方面建议编织到代码中

由于您的调用切入点,您从Spring容器中得到了一个异常。但是你想要AspectJ编织这个方面。然后,您需要使用编译时编织或加载时编织。编译时编织是插件提供的最简单的替代方案。

您可以将AspectJ编译器看作是一个高级Java编译器,它也支持AspectJ。因此,您可以在任何地方运行编译后的代码。

此外,您不需要该插件进行编译。例如,您可以使用Ant任务进行编译,正如我在这里展示的那样。

但最简单的选择是使用插件。这也为您提供了额外的帮助,我在这里简要介绍了这些帮助。

我希望这能有所帮助!

最新更新