2013-07-03 5 views
3

Я пытаюсь захватить изменение подписи метода и выбросить ошибку, когда это произойдет. Но ошибка объявить не работает, как ожидалосьAspectj объявляет ошибку не работает должным образом

@DeclareError("call(* a.b.C.method(..)) && !call(* a.b.C.method(int))") 
public static final String errorMsg= "Signature error"; 

Это всегда соответствия вызова этого метода.

Но если я переместил этот pointcut на @Before, то он не будет соответствовать, если подпись метода не изменилась.

Любая идея о том, почему по-разному поведение между @DeclareError & @ Прежде чем говорить о точках?

Thanks

ответ

2

странный - он работает в моей среде. (Eclipse, с AspectJ плагин)

@Aspect 
public class GetNameOverrider { 

    @DeclareError("call(* a.b.C.method(..)) && !call(* a.b.C.method(int))") 
    static final String errorMsg= "Signature error"; 
} 

дает мне ошибку во время компиляции, если я делаю:

a.b.C c = new a.b.C(); 
c.method(new Integer(2)); <--- no Error 
c.method(2); <--- no Error 
c.method("test"); <--- Error 

============================= 

ErrorDescription Resource Path Location Type 
"Signature error" Main.java /Stackoverflow/src/test line 12 AspectJ Problem 
+0

Вы правы. Я протестировал этот простой тестовый пример, и он работает нормально. Однако при использовании сложных объектов в качестве параметров, а не в String и int, они всегда совпадают. Моя подпись метода что-то вроде этого (MyObject, boolean, String, MyObject1, MyObject2, MyObject3, MyObject3) – user2546541

+0

Я нашел проблему. Я должен указать полное имя класса моих объектов для его работы. (a.b.MyObject, boolean, String, a.b.MyObject1, a.b.MyObject2, a.b.MyObject3, a.b.MyObject3) Спасибо за помощь Фред. Проблема закрыта – user2546541

+0

Да, полное имя класса необходимо, если вы используете стиль кодировки @AspectJ. Если вы используете собственный синтаксис, вам не нужно это делать, потому что вы можете просто импортировать все классы, используемые, как обычно, в Java. – kriegaex

Смежные вопросы