【问题标题】:Dependency Injection on a Composite (E4, RCP, SWT)组合上的依赖注入(E4、RCP、SWT)
【发布时间】:2014-01-27 15:29:14
【问题描述】:

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

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

这很好用。因此,如果用户打开部件,则会通过类在该部件上创建一个合成,并且在这个类中我有依赖注入:

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所以注射不起作用。 它适用于另一个零件,该零件是在创建此合成之前创建的,所以我不明白为什么此注入不起作用。

有人可以帮帮我吗?

【问题讨论】:

    标签: java dependency-injection swt e4


    【解决方案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");
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 2018-10-12
      • 2020-05-02
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多