AspectJ плетение с помощью ajc и IntelliJ - PullRequest
0 голосов
/ 17 апреля 2019

Я в растерянности ... Я прошел шаги от Intro до AspectJ , но когда я пытаюсь скомпилировать образцы с помощью ajc, я получаю "ajc: advice, определенный вlearning.AccountAspect не был применен [Xlint: adviceDidNotMatch] " предупреждение о моих советах до, после и после.Вот мой полный код:

Account.java

package learning;


public class Account {
    int balance = 20;

    public boolean withdraw(int amount) {
        if (balance < amount) {
            return false;
        }
        balance = balance - amount;
        return true;
    }
}

AccoutnAspect.aj

package learning;

public aspect AccountAspect {
    final int MIN_BALANCE = 10;

    pointcut callWithDraw(int amount, Account acc) :
            call(boolean Account.withdraw(int)) && args(amount) && target(acc);

    before(int amount, Account acc): callWithDraw(amount, acc) {
    }

    boolean around(int amount, Account acc) :
            callWithDraw(amount, acc) {
        if (acc.balance < amount) {
            System.out.println("Insufficient funds");
            return false;
        }
        System.out.println("Withdrawal approved");
        return proceed(amount, acc);
    }

    after(int amount, Account balance) : callWithDraw(amount, balance) {
    }
}

AccountTest.java

package learning;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class AccountTest {
    private Account account;

    @Before
    public void before() {
        account = new Account();
    }

    @Test
    public void given20AndMin10_whenWithdraw5_thenSuccess() {
        assertTrue(account.withdraw(5));
    }

    @Test
    public void given20AndMin10_whenWithdraw100_thenFail() {
        System.out.println(account.balance);
        assertFalse(account.withdraw(100));
        System.out.println(account.balance);
    }
}

У меня естьобщее понимание AOP и приличный опыт в C #, вкус AOP, PostSharp, но я не могу обернуться вокруг реализации AspectJ.Может ли кто-то пролить свет на то, что я упускаю из виду?

1 Ответ

1 голос
/ 24 апреля 2019

Спасибо за MCVE . Я клонировал это и нашел проблему. Как я уже говорил в моем предыдущем комментарии ...

Проблема должна быть в вашей сборке или настройке IDE, а не в AspectJ.

... у вас была проблема с управлением сборкой, если быть более точным, ваше Maven POM было неверным. Вы настроили AspectJ Maven в разделе <pluginManagement>, но на самом деле забыли добавить плагин к модулю Maven в разделе <plugins> следующим образом:

    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
        </plugin>
    </plugins>

Может быть, вам стоит сначала изучить основы Maven. Кстати, учебник, который вы читали, отличается от того, что вы делали в POM, поэтому проблема.

Кроме того, версия плагина RELEASE не работает, вам действительно нужно установить реальный номер версии, например 1.11. Я также сделал это для вас, плюс я удалил ваши файлы проекта IDEA из репозитория Git и оптимизировал / улучшил ваш файл .gitignore . Все эти изменения можно найти и просмотреть в моем запросе .

Теперь сборка Maven с mvn clean test, а также запуск теста из IntelliJ IDEA работают нормально.

Наслаждайтесь!

...