2014-01-08 10 views
6

Ich benutze Jetty 9.1 und Jersey 2.5.1. Jersey hat für Jetty integrierte Unterstützung, so beginne ich meinen Server wie folgt aus:Anlegesteg Eingebettet, Jersey 2, Weld

public static void main(String[] args) { 

    URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build(); 
    ResourceConfig config = ResourceConfig.forApplicationClass(MyApplication.class); 

    Server server = JettyHttpContainerFactory.createServer(baseUri, config); 
} 

MyApplication einfach this.packages(...) ruft meine REST-API-Klassen zum Nachschlagen.

Die Klasse REST api enthält jedoch ein mit @Inject annotiertes Feld, das von WELD injiziert werden sollte. Offensichtlich wird WELD nicht gestartet (CDI-Unterstützung nicht aktiviert), und seltsamer, es sieht so aus, als ob HK2 (von Jersey 2 verwendet) versucht, die Injektion durchzuführen.

(Ich habe eine org.glassfish.hk2.api.UnsatisfiedDependencyException beim Treffen der REST-Endpunkt).

Wie konfiguriere ich richtig WELD (vorzugsweise programmgesteuert)?

+0

Stellen Sie sicher, dass Sie Weld 2.2+ verwenden, da es nur einige Fehler bei der CDI-Integration mit Jetty 9.1+ behoben hat. –

Antwort

3

I verwendet Weld SE:

import org.jboss.weld.environment.se.Weld; 
import org.jboss.weld.environment.se.WeldContainer; 

Und dann

einfach
Weld weld = new Weld(); 
try { 
    WeldContainer container = weld.initialize(); 

    URI baseUri = UriBuilder.fromUri("http://localhost/").port(8080).build(); 
    ResourceConfig config = ResourceConfig.forApplicationClass(MyApplication.class); 

    Server server = JettyHttpContainerFactory.createServer(baseUri, config); 

    server.join(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    weld.shutdown(); 
} 

Beachten Sie, dass HK2 REST Klassen behandelt, so hatte ich ein Bindemittel zu schreiben, um die Injektionsarbeiten in diesen Klassen zu machen. This question helped me a lot.