我的项目基于spring框架2.5.4。我尝试为某些控制器添加方面(我使用aspectj 1.5.3)。

我已在 application-servlet.xml 中启用了自动代理,只需将这些行粘贴到 xml 文件的末尾:

<aop:aspectj-autoproxy />
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" />

创建方面:

package com.example.bg.web.utils;

import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AuditLogProcessor
{
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class);

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterHandleRequest() {
        log.info("test111");
    }

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))")
    public void afterRebuildThumbnail() {
        log.info("test222");
    }
}

我的控制器:

class AssetAddController implements Controller
class AssetThumbnailRebuildController extends MultiActionController

当我在方面顾问和调用控制器中设置刹车点时,我只会捕获AfterHandLereQuest(),但又不算AfferrebildThumbNail()我做错了什么?

笔记

我代表我的朋友问这个问题,他无法访问 SO beta,而且我不知道这是什么意思。

编辑

确实有一些拼写错误,谢谢 Cheekysoft。但问题仍然存在。

有帮助吗?

解决方案

你的断点没有被击中,因为你正在使用 Spring 的 AOP 代理。看 理解 aop 代理 了解 AOP 代理有何特殊之处。

基本上,MVC 框架将调用 handleRequest 控制器代理上的方法(例如 MultiActionController 如果您使用作为基类实现),则此方法将对其重建Thumbnail 方法进行“内部”调用,但这不会通过代理,因此不会获取任何方面。(这与最终方法无关。)

为了实现你想要的,请研究通过加载时编织(Spring 很好地支持)使用“真正的”AOP。

其他提示

AspectJ 不能很好地与 Spring Web MVC 框架中的类配合使用。 阅读页面右侧“打开以扩展...”框的底部

相反,请看一下 处理程序拦截器 界面。

新的 Spring MVC Annotations 可能也可以工作,因为控制器类都是 POJO,但我自己还没有尝试过。

基本设置看起来没问题。

通过不定义就地切入点并仅指定应应用后续建议的方法,可以稍微简化语法。(系统会自动为您创建方法的命名切入点。)

例如

@After( "com.example.bg.web.controllers.assets.AssetAddController.handleRequest()" )
public void afterHandleRequest() {
    log.info( "test111" );
}

@After( "com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()" )   
public void afterRebuildThumbnail() {
    log.info( "test222" );
}

只要rebuildThumbnail方法不是final,并且方法名称和类是正确的。我不明白为什么这行不通。

http://static.springframework.org/spring/docs/2.0.x/reference/aop.html

这就像拼写一样简单吗?或者问题中只是有拼写错误?有时你写 rebuildThumbnail 有时你写 rebildThumbnail

您尝试用建议覆盖的方法不是 MVC 框架中的最终方法,因此虽然 bpapas 答案很有用,但我的理解是,这不是本例中的问题。但是,请确保 rebuildThumbnail 控制器的操作不是最终的

@bpapas:如果我错了,请纠正我。程序员自己的控制器操作是他试图覆盖的。查看 MultiActionController 源(及其父级),堆栈中唯一可能最终确定的方法是 MultiActionController.invokeNamedMethod, ,尽管我不能 100% 确定当时是否会在堆栈中。在堆栈上方有一个最终确定的方法是否会导致向下方的方法添加 AOP 建议时出现问题?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top