2008-09-02 3 views
7

Мой проект основан на весеннем каркасе 2.5.4. И я пытаюсь добавить аспекты для некоторых контроллеров (я использую aspectj 1.5.3).Aspectj не улавливает все события весной?

Я включил автоматическое прокси в прикладном 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() но не послеRebildThumbnail() Что я сделал не так?

ПРИМЕЧАНИЕ

Я задаю этот вопрос от имени моего друга, который не имеет доступа к SO бета, и я понятия не имею, что это все о.

EDIT

Были действительно некоторые орфографические ошибки, благодаря Cheekysoft. Но проблема все еще сохраняется.

ответ

2

Ваши точки останова не попали, потому что вы используете Spring AOP в Proxies. См. understanding-aop-proxies для описания того, как пропуски AOP являются особыми.

В принципе, инфраструктура MVC будет вызывать метод handleRequest на прокси-сервере вашего контроллера (который, например, MultiActionController, который вы используете в качестве базового класса, реализует), этот метод затем сделает «внутренний» вызов его rebuildThumbnail метод, но это не будет проходить через прокси-сервер и, таким образом, не будет поднимать какие-либо аспекты. (Это не имеет никакого отношения к тому, что методы являются окончательными.)

Для достижения того, что вы хотите, исследуйте использование «реального» АОП через ткачество времени загрузки (которое поддерживает Spring очень хорошо).

0

Это просто, как правописание? или есть только опечатки в вопросе? Иногда вы пишете rebuildThumbnail и иногда вы пишете rebildThumbnail

методы, которые вы пытаетесь переопределить с советами не являются окончательными методами в рамках MVC, так что в то время как bpapas ответ полезно, я понимаю, что это не проблема в этом дело. Тем не менее, убедитесь, что действие контроллера rebuildThumbnail не является окончательным

@bpapas: пожалуйста, исправьте меня, если я ошибаюсь. Собственное действие контроллера контроллера - это то, что он пытается переопределить. Если посмотреть на источник MultiActionController (и его родителей), единственным окончательным методом, потенциально в стеке, является MultiActionController.invokeNamedMethod, хотя я не уверен на 100%, если бы это было в стеке в то время или нет. Будет ли иметь завершенный метод выше стека, а проблема с добавлением AOP-метода к дальнейшему методу?

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 не является окончательным, а имя метода и класса являются правильными. Я не понимаю, почему это не сработает.

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