我正在尝试使用 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]
它所期待的对我来说毫无意义。我将该声明分成不同的行,这就是我看到它在第二次结束时抱怨的方式,(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 有任何影响otu 为什么我有这个问题。正如我所听说的,观察者模式只能使用 aspectj 来实现,这就是我使用的。错误没有意义