Второй вызов метода, рекомендованного Aspectj, игнорируется - PullRequest
0 голосов
/ 06 сентября 2011

Я добавляю несколько советов AspectJ в мой Java-проект на основе Spring .Когда я запускаю перехваченный метод один раз, все работает нормально (т.е. совет выполняется).Однако следующий вызов того же самого метода больше не проходит через прокси.

Это мой тестовый код:

@Test
public void testFooOperationIsAdviced() throws Exception {
    TestController testController = appContext.getBean("testController");
    testController.foo();
    testController.foo();
}

Вот метод foo():

@Protect()
public void foo() {
    System.err.println("foo!")
}

И это важная часть моей конфигурации Spring:

<aop:aspectj-autoproxy />
<bean name="myAdvice" class="mypackage.MyAdvice"/>

<bean id="testController" class="mypackage.MyTestControllerImpl" />

<aop:config>
    <aop:aspect id="protectAspect" ref="myAdvice">
        <aop:pointcut id="annotatedController" expression="execution(public * mypackage.*+.*(..)) and @annotation(protect)" />
        <aop:around pointcut-ref="annotatedController" method="applyProtectionRules" arg-names="protect"/>
    </aop:aspect>
</aop:config>

В настоящее время аспект просто выполняет System.err.println("advice") и pp.proceed().

Итак, если мы выполнимВ тесте, приведенном выше, вы ожидаете

совета foo!advice foo!

Однако, что я получаю:

advice foo!

Второй вызов никогда не доходит до совета!И, что еще хуже, целевой метод даже не выполняется .

Есть ли у вас какие-либо подсказки относительно того, почему это происходит?

Примечание 1: Чтобы все стало еще хужеИногда, когда я выполняю с отладчиком и иду шаг за шагом, это работает нормально.Без шуток ...

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

Примечание 3: Я хочу придерживаться Spring.Я не могу жестко закодировать точки в Java-коде, так как хочу, чтобы пользователь библиотеки предоставил их, и единственный способ, о котором я могу подумать, - позволить им определить блок aop:config.

1 Ответ

2 голосов
/ 06 сентября 2011

Глядя на трассу стека длиной 2 километра, я увидел CachingInterceptor ... Это и есть загадка: наш собственный механизм кэширования, основанный на перехватчике метода Spring, делал свое дело.Время его ожидания составляет 120 секунд, и поэтому, когда я использовал отладчик, выполнение выглядело нормально.

Я не буду закрывать свой (по общему мнению, глупый) вопрос, если он поможет другим.Немного перспективы и нестандартного мышления помогло бы!

...