我正在尝试使用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)
我应该使用实际实现主题/观察者的类,但方面拒绝看到它们(它没有看到它们实现的方法)所以我不knwo如果它在findign otu有任何不同,为什么我有这个问题。正如我所听到的,观察者模式只能使用aspectj实现,这就是我使用的。错误没有意义