AspectJ (Spring ではない) を使用してオブザーバー パターンをプログラムに実装しようとしています。追加のオブザーバー メソッドを記述しようとしましたが、コンパイラが文句を言うようです
after(Subject employee, Observer handler): execution(com.company.domain.EmployeeController.registerTo(*))&& this(handler)&& args(employee){
employee.addObserver(handler);
}
文句を言うオールトはthis:execution(com.company.domain.EmployeeController.registerTo(*))
エラーは次のとおりです。
[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.10:compile (default) on project SpaceX: AJC compiler errors:
[ERROR] error at after(Subject employee, Observer handler): execution(com.company.domain.EmployeeController.registerTo(*))&& this(handler)&& args(conc){
[ERROR]
[ERROR] D:\Projects2016\SpaceX\src\main\java\aspects\SpacexObserver.aj:12:0::0 Syntax error on token ")", "(" expected
[ERROR] -> [Help 1]
それが何を期待しているのか、私には意味がありません。その宣言を別の行に分割したところ、それが括弧の 2 番目の終了時に正確に不平を言っていることがわかりました(com.company.domain.EmployeeController.registerTo(*)--->)<---
。なぜそれが不平を言っているのかわからない
私は、aspectj のバージョンを変更しようとしましたが、何もしません。パラメータを * 以外のものに変更すると、別のバージョンがスローされるだけなので、なぜそれが気に入らないのかわかりません。
メソッドを削除してアスペクトを実行しようとすると、全体が意味をなさず、これをデバッグする方法もわからないため、機能しません。
私はまだ何が起こっているのかを知る必要があります。ここにアスペクト全体を投稿します。おそらく、数日後に原因を突き止めることができるかもしれませんが、すべてを考慮してプログラムが機能しない理由をまだ見つけることができません。
public privileged aspect SpacexObserver extends AbstractObserver{
protected pointcut observed(Subject o):execution(* com.company.domain.EmployeeController.createDesign(..)) && target(o);
//adding an observer
after(Subject employee, Observer handler): execution(com.company.domain.EmployeeController.registerTo(*))&& this(handler)&& args(employee){
employee.addObserver(handler);
System.out.println("wer");
}
//removing an observer
// after(ViewResultsHandler handler):execution(* ViewResultsHandler.close())&& target(handler){
// Employee con=handler.concurs;
// con.removeObserver(handler);
//
// }
//observer action
public void Employee.update(Object o){
System.out.println("call loadParticipants");
}
}
そして、AbstractObserver 部分については、次のようにしています。
protected interface Subject{
void addObserver(Observer o);
// void removeObserver(Observer o);
void notifyObservers(Object newData);
}
protected interface Observer{
void update(Object newData);
}
private Set<Observer> Subject.observers=new HashSet<Observer>();
public void Subject.addObserver(Observer o){
System.out.println("Adding observer");
observers.add(o);
}
public void Subject.removeObserver(Observer o){
System.out.println("Removing observer");
observers.remove(o);
}
public void Subject.notifyObservers(Object newData){
for(Observer obs:observers){
obs.update(newData);
}
}
protected abstract pointcut observed(Subject o);
after (Subject o) returning:observed(o){
o.notifyObservers(null);
}
}
ここafter(Subject employee, Observer handler)
では、サブジェクト/オブザーバーを実際に実装するクラスを使用することになっていると思いますが、アスペクトはそれらをそのように見ることを拒否します(実装するメソッドは表示されません)ので、findignに違いがあるかどうかはわかりませんなぜ私はこの問題を抱えているのですか。私が聞いたように、オブザーバーパターンはaspectjを使用してのみ実装でき、それが私が使用しているものです。エラーは意味がありません