我正在开发E4 RCP应用程序,我遇到以下问题: 我有一个在应用程序开头不可见的部分(toBeRendered =“false”visible =“false”)。 当一个按钮点击其他声部时,我会执行以下操作:
MPart s = partService.findPart("S");
if (s != null) {
s.setToBeRendered(true);
s.setVisible(true);
partService.activate(s); }
这很有效。因此,如果用户打开部件,则通过类在该部件上创建Composite,并且在此类中我有依赖注入:
public class S {
....
@Focus
public void focusGained() {
...
MyComposite m = new MyComposite(parent, SWT.NONE);
...
}
}
public class MyComposite extends Composite {
@Named("list")
private HashMap<String, Ex> myMap;
public MyComposite(Composite parent, int style) {
super(parent, style);
myMap.get("key");
}
}
但是我在myMap.get(“key”)得到一个NullPointerException;所以注射不起作用。 它适用于另一个Part,它是在创建Composite之前创建的,所以我不明白为什么这个注入不起作用。
是的,有人可以帮帮我吗?答案 0 :(得分:1)
仅在应用程序模型知道的对象上执行注入。您自己正在创建MyComposite
,因此未进行注射。
您可以使用以下内容进行注射:
MyComposite m = new MyComposite(parent, SWT.NONE);
ContextInjectionFactory.inject(m, context);
注意:这不会在构造函数中执行注入,使用@PostConstruct
方法。
在任何情况下,只有在构造函数运行之后才进行字段注入,因此构造函数代码永远不会在注入时运行。
更新:您在该字段上也只有@Named
,您还需要@Inject
。
所以你的班级需要看起来像:
public class MyComposite extends Composite {
@Named("list")
@Inject
private HashMap<String, Ex> myMap;
public MyComposite(Composite parent, int style) {
super(parent, style);
}
@PostConstruct
void postConstruct() {
myMap.get("key");
}
}