Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Aspectj doesn't catch all events in spring framework?

My project is based on spring framework 2.5.4. And I try to add aspects for some controllers (I use aspectj 1.5.3).

I've enabled auto-proxy in application-servlet.xml, just pasted these lines to the end of the xml file:

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

Created aspect:

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");
    }
}

My controllers:

class AssetAddController implements Controller
class AssetThumbnailRebuildController extends MultiActionController

When I set brake points in aspect advisors and invoke controllers I catch only afterHandleRequest() but not afterRebildThumbnail() What did I do wrong?

NOTE

I'm asking this question on behalf of my friend who doesn't have access to SO beta, and I don't have a clue what it's all about.

EDIT

There were indeed some misspellings, thanks Cheekysoft. But the problem still persists.

like image 435
Serge Avatar asked Sep 02 '08 14:09

Serge


2 Answers

Your breakpoints aren't being hit because you are using Spring's AOP Proxies. See understanding-aop-proxies for a description of how AOP Proxies are special.

Basically, the MVC framework is going to call the handleRequest method on your controller's proxy (which for example the MultiActionController you're using as a base class implements), this method will then make an "internal" call to its rebuildThumbnail method, but this won't go through the proxy and thus won't pick up any aspects. (This has nothing to do with the methods being final.)

To achieve what you want, investigate using "real" AOP via load time weaving (which Spring supports very nicely).

like image 64
Ed Thomas Avatar answered Sep 23 '22 22:09

Ed Thomas


AspectJ doesn't work well with classes in the Spring Web MVC framework. Read the bottom of the "Open for extension..." box on the right side of the page

Instead, take a look at the HandlerInterceptor interface.

The new Spring MVC Annotations may work as well since then the Controller classes are all POJOs, but I haven't tried it myself.

like image 39
bpapa Avatar answered Sep 19 '22 22:09

bpapa