Новичок, работающий с AspectJ: Невозможно получить аспект под названием - PullRequest
3 голосов
/ 18 ноября 2010

Итак, я начал изучать использование AspectJ для обработки событий при изменении состояния объекта в моем домене.

По сути, я хотел бы написать совет, который охватывает все методы сеттера в моем домене. Когда вызывается совет, он проверит начальное значение устанавливаемого поля, запустит установщик, а затем проверит значение после его выполнения. Если значение изменяется, оно отправляет событие в прослушиватель событий, информируя об изменении.

Я использовал учебник, найденный здесь: http://www.andrewewhite.net/wordpress/2010/03/17/aspectj-annotation-tutorial/,, но я не могу получить какие-либо рекомендации для звонков. Обратите внимание, что я использую только метод LTW для создания своих советов, я не пишу советы с использованием языка AspectJ и его предварительной компиляции.

Мой aop.xml (в META-INF для моего набора тестов) выглядит так:

<aspectj>
    <aspects>
        <aspect name="domain.aop.TestAspect"/>
    </aspects>
</aspectj>

Созданный мной класс Aspect выглядит следующим образом:

package domain.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class TestAspect
{
    @Around("call(* domain.*.set*(..))")
    public void aroundSetMethods (JoinPoint jp)
    {
        System.out.println ("aroundSetMethod called");
    }
}

Когда я запускаю свой тестовый пример, я вижу (устанавливая точку останова), что вызывается метод (domain.Error.setTask ()). Я уверен, что это должно вызвать мой совет, но я никогда не использую метод совета.

Есть какие-нибудь указатели на то, что я здесь делаю неправильно?

Спасибо

1 Ответ

3 голосов
/ 22 ноября 2010

Вы также должны указать, какие классы вы хотите соткать.

Попробуйте заменить файл aop.xml следующим:

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in this package -->
        <include within="domain.*" />
    </weaver>
    <aspects>
        <!-- use only this aspect for weaving -->
        <aspect name="domain.aop.TestAspect"/>
    </aspects>
</aspectj>

Если вы правильно настроили сервер времени выполнения или агент Java, вы также можете увидеть процесс переплетения в своем журнале.

Надеюсь, это поможет!

...