2014-09-09 10 views
9

Ich bekomme die folgende Ausnahme, wenn ich versuche, ein WebTarget von einem Jersey-Client zu erstellen.Fehler bei der Verwendung von Jersey-Client in osgi - Kein Generator wurde zur Verfügung gestellt

Mein Code

Client client = ClientBuilder.newClient(); 
WebTarget baseTarget = client.target("http://127.0.0.1:9000"); 

Ausnahme-Stack-Trace

java.lang.IllegalStateException: No generator was provided 
and there is no default generator registered 
    at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.internalCreate(ServiceLocatorFactoryImpl.java:266) 
    at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.create(ServiceLocatorFactoryImpl.java:247) 
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:138) 
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:109) 
    at org.glassfish.jersey.internal.RuntimeDelegateImpl.<init>(RuntimeDelegateImpl.java:61) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at java.lang.Class.newInstance(Class.java:374) 
    at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:118) 
    at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:225) 
    at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:135) 
    at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120) 
    at javax.ws.rs.core.UriBuilder.newInstance(UriBuilder.java:95) 
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119) 
    at org.glassfish.jersey.client.JerseyWebTarget.<init>(JerseyWebTarget.java:71) 
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:185) 
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:70) 

Was das Problem sein könnte?

Antwort

16

Fügen Sie die folgenden Archive aus dem Jersey-ext-Verzeichnis auf Ihrem Classpath.

hk2-api - * jar

hk2-locator - * jar

hk2-utils- *. .jar

javax-inject - * jar

Jersey-Guave -. *. jar

+0

Ich habe das gleiche Problem und habe alle diese JAR-Dateien in meinem Klassenpfad, aber immer noch die Ausnahme. Ich habe auch bemerkt, dass es die folgende Warnung gibt: WARNUNG: Kann eine Standardimplementierung des HK2 ServiceLocatorGenerator nicht finden –

+0

Ich erfuhr genau das gleiche Problem und es stellte sich heraus, dass es einen Konflikt von Gläsern gab. Um es zu relativieren, meine Laufzeit ist OSGI, wo es gut lief, aber als ich versuchte, den Jersey-Client mit der Java-Klasse via Eclipse auszuführen, würde es die Ausnahme auslösen. Die Lösung, die für mich funktionierte, war, dass ich alle Klassenpfadabhängigkeiten entfernte, die von OSGI verwendet wurden, und ich fügte die Bibliotheken hinzu, die in dieser Antwort erwähnt werden. Außerdem musste ich Jersey Client und Jersey Common Bibliotheken hinzufügen. Ich hoffe das hilft. Ich wünschte, die Trikot-Distribution würde sie nur bündeln, so dass die Entwickler nicht suchen müssen. –

+0

Ich habe hk2-locator- * vergessen.jar, das den obigen Fehler verursacht hat. Wenn hinzugefügt mein Problem gelöst. – Yergalem

6

Registrieren Sie hk2-locator und javassist als Bundles in Ihrem OSGi-Framework.

Jersey verwendet hk2-locator, um Dienste auf OSGi zu finden.

1

Ich hatte das gleiche Problem und konnte es schließlich lösen, indem ich mein Bundle startete, das Jersey verwendet, um einen Endpunkt auf Level 2 im Felix Framework (OSGi-5.4) zu veröffentlichen. Ich bin nicht sicher, warum, aber scheint, wie die HK2-Locator Abhängigkeiten:

  • hk2-api-2.4.0-b10.jar -> Stufe 1
  • hk2-locator-2.4.0-b10.jar -> Stufe 1
  • hk2-utils-2.4.0-b10.jar -> Stufe 1
  • org.apache.servicemix.bundles.javax-Inject-1_2.jar -> Stufe 1
  • Jersey-Guave -2.22.1.jar -> Ebene 1

müssen zuerst vor dem Bundle gestartet werden wer sie verwendet:

  • your-Bundle-1.0.0.jar -> Stufe 2

Sobald Sie Ihr Bündel gesetzt auf dieser neuen Ebene zu starten, stellen Sie sicher, auszuführen frameworklevel 2 in Felix Konsole starte die Bündel unter dieser Ebene. Starten Sie das Framework neu und es wird funktionieren.

+0

Das hat das Problem für mich in Felix behoben. –