7

我的项目基于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() 而不是 afterRebildThumbnail() 我做错了什么?

笔记

我代表无法访问 SO Beta 的朋友提出这个问题,但我不知道这是怎么回事。

编辑

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

4

4 回答 4

2

因为您使用的是 Spring 的 AOP 代理,所以您的断点没有被命中。有关 AOP 代理的特殊之处的描述,请参阅理解-aop-代理

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

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

于 2008-09-15T22:35:30.613 回答
1

AspectJ 不适用于 Spring Web MVC 框架中的类。阅读页面右侧“打开以进行扩展...”框的底部

相反,请查看HandlerInterceptor接口。

从那时起,新的 Spring MVC Annotations 可能也可以工作,Controller 类都是 POJO,但我自己没有尝试过。

于 2008-09-02T15:15:45.790 回答
1

基本设置看起来不错。

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

例如

@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

于 2008-09-03T11:31:19.830 回答
0

这和拼写一样简单吗?还是问题中只有拼写错误?有时你写rebuildThumbnail,有时你写rebildThumbnail

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

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

于 2008-09-03T11:01:34.567 回答