0

在这一刻,我面临一个问题,真的不知道我做错了什么。我正在使用 @AspectJ 样式的 Spring 框架和 AOP 为我的 web 服务编写日志记录。我有两个包 - 背景和前端。在后台包中,我有 LogAspect,如下所示:

@Aspect
public class LogAspect {
    @Pointcut("@annotation(logMethod)")
    public void logMethodAnnotated(LogMethod logMethod){}

    @Before("logMethodAnnotated(logMethod)")
    public void beforeLogMethodAnnotated(JoinPoint jp){
        //actions
    }

    @After("logMethodAnnotated(logMethod)")
    public void afterLogMethodAnnotated(JoinPoint jp){
        //actions   
    }
}

和 META-INF/spring/background-osgi.xml:

<context:annotation-config />
<context:component-scan base-package="simon.background"/>

<context:load-time-weaver />   

还有 META-INF/aop.xml:

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

    <weaver>

        <!-- only weave classes in our application-specific packages -->
        <include within="simon.background.*"/>
        <include within="simon.frontend.controller.*"/>

    </weaver>

    <aspects>

        <!-- weave in just this aspect -->        
        <aspect name="simon.background.log.LogAspect"/>

    </aspects>

  </aspectj>

在前端包中,我刚刚放入了 aplicationContext.xml<context:load-time-weaver aspectj-weaving="on" />. 但是代码表现得很奇怪。当我将建议方法 JoinPoint 作为参数放入时,我发现存在一些问题。(我的意思是,当我得到不带参数的建议方法时,因此方法头中没有 JoinPoin,一切正常,并且建议在 @LogMethod 之前和之后一直在运行(我的注释,我曾经说过,我想要记录此方法)注释的方法)。但现在它的工作方式如下: - 当我启动服务器并首次部署包时,建议仅针对方法运行,它们是 @LogMethod 注释的并且属于后台包,但不适用于带注释的方法在前端.控制器中。- 此外,当我在其中一个控制器中进行了一些更改、保存并仅部署前端包时,然后当我运行 @LogMethod 注释方法时,

org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常是 java.lang.LinkageError: loader constraint violation: 当解析方法“simon.background.log.LogAspect.afterLogMethodAnnotated(Lorg/aspectj/lang/JoinPoint;)V”类加载器(com/springsource/kernel/的实例当前类 simon/frontend/controller/HuhController 的 userregion/internal/equinox/KernelBundleClassLoader) 和已解析类 simon/background/ 的类加载器(com/springsource/kernel/userregion/internal/equinox/KernelBundleClassLoader 的实例) log/LogAspect,对于签名中使用的 /aspectj/lang/JoinPoint 类型有不同的 Class 对象;)V

任何想法发生了什么以及如何修复它,以便我的程序能够正确运行建议?

另外一点,它可能会有所帮助:当我在调试模式下使用没有 JoinPoint 参数的建议运行它时,我意识到,两个建议都针对一种方法运行了两次。

4

2 回答 2

0

运行两次,可能是因为您同时使用两者吗?<context:annotation-config> 与 <context:component-scan> 之间的区别

于 2013-02-21T23:13:03.220 回答
0

您的切入点已被触发两次,因为您的表达式仅约束注释类型。当一个方法被调用时,call()两者execution()都匹配这个表达式。

您可以使用@annotation(xxx) && execution(* *(..))切入点来限制执行条件。

于 2019-07-19T03:30:40.210 回答