2017-12-26 5 views
0

In meinem Bündel Aktivator versuche ich Felder "IEventBroker" und "EPartService" zu injizieren. Aber erst gespritzt. Code folgt:Kann nicht injizieren EPartService

@Inject 
IEventBroker m_broker; 
@Inject 
EPartService m_part_service; 

public void start(BundleContext context) throws Exception { 

    IEclipseContext service_context = EclipseContextFactory.getServiceContext(context); 
    ContextInjectionFactory.inject(this, service_context); 
    boolean contains = service_context.containsKey(EPartService.class); 

    // contains is always "true", but m_part_service is always "null" 
    // all follows invocations returns "null" too 
    // 
    // service_context.get(EPartService.class); 
    // service_context.getActiveLeaf().getActive(EPartService.class); 
    // service_context.getActiveLeaf().getLocal(EPartService.class);  
    // context.getServiceReference(EPartService.class); 

    // m_broker always non-null 
    m_broker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() 
     { 
      @Override 
      public void handleEvent(Event event) 
      { 
       // ... bla bla bla 
      } 
     }); 
} 

In internen Listen von IEclipseContext fand ich EPartService. Können Sie mir helfen? Was habe ich falsch gemacht?

Antwort

0

Bündelaktivatoren sind nicht injiziert, so dass Sie @Inject nicht verwenden können.

Der von zurückgegebene Kontext hat sehr begrenzte Inhalte und kann nicht verwendet werden, um auf Dinge wie EPartService zuzugreifen.

In jedem Fall wird der bundle activator in der Regel nicht einmal ausgeführt, bis etwas anderes in Ihrem Plugin verwendet wird, so dass es zu spät wäre, die startup complete Nachricht trotzdem zu sehen.

Also all das bedeutet, dass Sie nicht tun können, was Sie im Bündel Aktivator start Methode tun möchten.

Um über das Ereignis App Startup Complete benachrichtigt zu werden, können Sie die Anwendung LifeCycle Klasse verwenden oder ein AddOn definieren - diese beiden Klassen werden injiziert.

In diesen Klassen verwenden eine Methode, wie:

@Optional 
@Inject 
public void appStartupComplete(@UIEventTopic(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE) 
           org.osgi.service.event.Event event) 
+0

Vielen Dank für Ihre Antwort. Meine Anwendung hat mit der eigenen config.ini begonnen. In dieser Konfiguration starte ich meine Plugins in der benötigten Reihenfolge. Bundle mit Code oben ist kein Anwendungs-Plugin. Und ich muss einen Teil öffnen, wenn ich eine Nachricht vom TCP-Socket bekomme. Also muss ich EPartService injizieren, um Teile in Klassen zu öffnen, die nicht mit der Benutzeroberfläche zu tun haben. Code mit "m_broker" Ich habe hinzugefügt, um zu zeigen, dass "IEventBroker" -Service wurde injiziert und es ist nicht mit meiner Frage verbunden. Ich brauche EPartService .... – Say

+0

Der Bündelaktivator ist immer noch der falsche Ort. Verwenden Sie ein AddOn, bei dem die Injektion ordnungsgemäß funktioniert. –

+0

Wenn das Plugin nicht das Hauptanwendungs-Plugin ist, benutze ein Fragment.e4xmi für das AddOn –

Verwandte Themen