Wenn ich ohne Vorkenntnisse in Jersey 1.x von vorne anfange, fällt es mir schwer zu verstehen, wie die Abhängigkeitsinjektion in meinem Jersey 2.0-Projekt eingerichtet wird.
Ich verstehe auch, dass HK2 in Jersey 2.0 verfügbar ist, aber ich kann anscheinend keine Dokumente finden, die bei der Integration von Jersey 2.0 helfen.
@ManagedBean
@Path("myresource")
public class MyResource {
@Inject
MyService myService;
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/getit")
public String getIt() {
return "Got it {" + myService + "}";
}
}
@Resource
@ManagedBean
public class MyService {
void serviceCall() {
System.out.print("Service calls");
}
}
pom.xml
<properties>
<jersey.version>2.0-rc1</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jax-rs-ri</artifactId>
</dependency>
</dependencies>
Ich kann den Container starten und meine Ressource bereitstellen, aber sobald ich @Inject zu MyService hinzufüge, löst das Framework eine Ausnahme aus:
SEVERE: Servlet.service() for servlet [com.noip.MyApplication] in context with path [/jaxrs] threw exception [A MultiException has 3 exceptions. They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)
2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.noip.MyResource errors were found
3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.noip.MyResource
] with root cause
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
Mein Starterprojekt ist bei GitHub verfügbar: https://github.com/donaldjarmstrong/jaxrs
quelle
EntityManager
ist, aber nach docs.oracle.com/javaee/6/api/javax/persistence/… zu urteilen , scheint es eine Schnittstelle zu sein. Sie können es mit bindenbind(EntityManagerImpl.class).to(EntityManager.class)
(wodurch eine KlasseEntityManagerImpl
gebunden wird, die die Schnittstelle implementiertEntityManager
. Wenn Sie eine Factory verwenden müssen, schauen SiebindFactory()
in dieAbstractBinder
. Wenn Sie dabei Hilfe benötigen, erstellen Sie bitte eine neue Frage (ich habe keinen Platz dafür Beantworten Sie es in den Kommentaren. Außerdem bin ich mir nicht sicher, ob Sie @PersistentContext verwenden sollten. Verwenden Sie einfach @Inject für allesZuerst nur um einen Kommentar in der akzeptierten Antwort zu beantworten.
Es liest einfach
bind( implementation ).to( contract )
. Sie können alternative Kette.in( scope )
. Standardumfang vonPerLookup
. Wenn Sie also einen Singleton wollen, können SieEs gibt auch eine zur
RequestScoped
VerfügungAnstelle von
bind(Class).to(Class)
können Sie auchbind(Instance).to(Class)
, was automatisch ein Singleton sein wird.Hinzufügen zur akzeptierten Antwort
Für diejenigen, die herausfinden
AbstractBinder
möchten , wie Sie Ihre Implementierung in Ihrer web.xml registrieren können (dh Sie verwenden keineResourceConfig
), wird der Ordner anscheinend nicht durch das Scannen von Paketen entdeckt, d. H.Oder das auch nicht
Damit es funktioniert, musste ich Folgendes implementieren
Feature
:Die
@Provider
Anmerkung sollte es ermöglichenFeature
, dass das Paket beim Scannen des Pakets erfasst wird. Oder ohne Paket Scannen können Sie explizit das RegisterFeature
in derweb.xml
Siehe auch:
und für allgemeine Informationen aus der Jersey-Dokumentation
AKTUALISIEREN
Fabriken
Abgesehen von der grundlegenden Bindung in der akzeptierten Antwort verfügen Sie auch über Fabriken, in denen Sie über eine komplexere Erstellungslogik verfügen und auf Kontextinformationen anfordern können. Beispielsweise
Dann können Sie
MyService
in Ihre Ressourcenklasse einfügen.quelle
web.xml
obwohl dieconfigure()
aufHk2Feature
genannt wird, Ressource anfordernden wirft einNullPointerException
. @ PaulSamsothaDie ausgewählte Antwort stammt aus einer Weile zurück. Es ist nicht praktisch, jede Bindung in einem benutzerdefinierten HK2-Binder zu deklarieren. Ich verwende Tomcat und musste nur eine Abhängigkeit hinzufügen. Obwohl es für Glassfish entwickelt wurde, passt es perfekt in andere Behälter.
Stellen Sie sicher, dass auch Ihr Container ordnungsgemäß konfiguriert ist ( siehe Dokumentation ).
quelle
Spät, aber ich hoffe das hilft jemandem.
Ich habe mein JAX RS folgendermaßen definiert:
Dann kann ich in meinen Code endlich einspritzen:
In meinem Fall
SomeManagedBean
handelt es sich um eine ApplicationScoped-Bean.Hoffe das hilft jedem.
quelle
Oracle empfiehlt, die @ Path-Annotation allen zu injizierenden Typen hinzuzufügen, wenn JAX-RS mit CDI kombiniert wird: http://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm Dies ist jedoch alles andere als perfekt ( Wenn Sie beispielsweise beim Start eine Warnung von Jersey erhalten, habe ich mich für diese Route entschieden, wodurch ich nicht alle unterstützten Typen in einem Ordner verwalten kann.
Beispiel:
quelle
Wenn Sie Guice bevorzugen und nicht alle Bindungen deklarieren möchten, können Sie auch diesen Adapter ausprobieren:
Guice-Bridge-Jit-Injektor
quelle
Bei mir funktioniert es ohne die
AbstractBinder
folgenden Abhängigkeiten in meiner Webanwendung (läuft unter Tomcat 8.5, Jersey 2.27):Es funktioniert mit CDI 1.2 / CDI 2.0 für mich (jeweils mit Weld 2/3).
quelle
Für den erholsamen Trikot-Service ist eine Abhängigkeit erforderlich, und Tomcat ist der Server. Dabei ist $ {jersey.version} 2.29.1
Der Basiscode lautet wie folgt:
quelle