2

我尝试在站点中运行一个简单的 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 配置文件中,我只有 @aspect 注释类的 bean 定义和<aop:aspectj-autoproxy />. 我的罐子是:spring-aop-3.0.5、aopalliance、aspectjrt1.6.8、aspectjweaver1.5.0

4

1 回答 1

2

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

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

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

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

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

您可以将 AspectJ 编译器视为也支持 AspectJ 的高级 Java 编译器。所以你可以在任何地方运行你编译的代码。

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

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

我希望这有帮助!

于 2011-06-29T15:20:55.893 回答