1

我目前正在开发 E4 RCP 应用程序,但遇到以下问题:我有一个在应用程序打开时不可见的部件 (toBeRendered="false" visible="false")。当另一个部件上的按钮单击发生时,我执行以下操作:

MPart s = partService.findPart("S");
if (s != null) {
s.setToBeRendered(true);
s.setVisible(true);
partService.activate(s); }

这很好用。因此,如果用户打开 Part (s),则通过一个类在该 Part 上创建一个 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 所以注射不起作用。它适用于另一个部分,该部分是在创建此合成之前创建的,所以我不明白为什么此注入不起作用。

有人可以帮我吗?

4

1 回答 1

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");
  }
}
于 2014-01-24T11:37:37.187 回答