1

私は現在 E4 RCP アプリケーションを開発していますが、次の問題があります: アプリケーションの開始時に見えないパーツがあります (toBeRendered="false" visible="false")。別のパーツでボタン クリックが発生した場合は、次のようにします。

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 が発生します。したがって、インジェクションは機能しません。このコンポジットが作成される前に作成された別のパーツで機能するため、このインジェクションが機能しない理由がわかりません。

誰か助けてください。

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 に答える