En partant de zéro sans aucune connaissance préalable de Jersey 1.x, j'ai du mal à comprendre comment configurer l'injection de dépendances dans mon projet Jersey 2.0.
Je comprends également que HK2 est disponible dans Jersey 2.0, mais je n'arrive pas à trouver des documents qui aident à l'intégration de Jersey 2.0.
@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>
Je peux faire démarrer le conteneur et servir ma ressource, mais dès que j'ajoute @Inject à MyService, le framework lève une exception:
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)
Mon projet de démarrage est disponible sur GitHub: https://github.com/donaldjarmstrong/jaxrs
la source
EntityManager
c'est, mais à en juger par docs.oracle.com/javaee/6/api/javax/persistence/ ... cela semble être une interface. Vous pouvez le lier en utilisantbind(EntityManagerImpl.class).to(EntityManager.class)
(qui liera une classeEntityManagerImpl
implémentant l'interfaceEntityManager
. Si vous avez besoin d'utiliser une fabrique, jetez un œilbindFactory()
dans leAbstractBinder
. Si vous avez besoin d'aide, créez une nouvelle question (je n'aurai pas la place pour Répondez-y dans les commentaires). De plus, je ne suis pas sûr que vous devriez utiliser @PersistentContext, utilisez simplement @Inject pour toutTout d'abord pour répondre à un commentaire dans la réponse accepte.
Il lit simplement
bind( implementation ).to( contract )
. Vous pouvez chaîne alternative.in( scope )
. Portée par défaut dePerLookup
. Donc si tu veux un singleton, tu peuxIl y a aussi un
RequestScoped
disponibleEn outre, au lieu de
bind(Class).to(Class)
, vous pouvez égalementbind(Instance).to(Class)
, qui sera automatiquement un singleton.Ajout à la réponse acceptée
Pour ceux qui essaient de comprendre comment enregistrer votre
AbstractBinder
implémentation dans votre web.xml (c'est-à-dire que vous n'utilisez pas aResourceConfig
), il semble que le classeur ne sera pas découvert par l'analyse des paquets, c'est-à-direOu ceci soit
Pour le faire fonctionner, j'ai dû implémenter un
Feature
:L'
@Provider
annotation doit permettreFeature
à la numérisation de l'emballage. Ou sans analyse de package, vous pouvez enregistrer explicitement leFeature
dans leweb.xml
Voir également:
et pour les informations générales de la documentation Jersey
METTRE À JOUR
Des usines
Outre la liaison de base dans la réponse acceptée, vous avez également des usines, dans lesquelles vous pouvez avoir une logique de création plus complexe et avoir également accès aux informations de contexte de demande. Par exemple
Ensuite, vous pouvez injecter
MyService
dans votre classe de ressources.la source
web.xml
même siconfigure()
onHk2Feature
est appelé, la demande de ressource lève unNullPointerException
. @PaulSamsothaLa réponse choisie remonte à un certain temps. Il n'est pas pratique de déclarer chaque liaison dans un classeur HK2 personnalisé. J'utilise Tomcat et je devais juste ajouter une dépendance. Même s'il a été conçu pour Glassfish, il s'intègre parfaitement dans d'autres conteneurs.
Assurez-vous que votre conteneur est également correctement configuré ( voir la documentation ).
la source
Tard mais j'espère que cela aide quelqu'un.
J'ai mon JAX RS défini comme ceci:
Ensuite, dans mon code, je peux enfin injecter:
Dans mon cas, le
SomeManagedBean
est un bean ApplicationScoped.J'espère que cela aide à n'importe qui.
la source
Oracle recommande d'ajouter l'annotation @Path à tous les types à injecter lors de la combinaison de JAX-RS avec CDI: http://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm Bien que cela soit loin d'être parfait ( par exemple, vous recevrez un avertissement de Jersey au démarrage), j'ai décidé de prendre cette route, ce qui m'évite de conserver tous les types pris en charge dans un classeur.
Exemple:
la source
Si vous préférez utiliser Guice et que vous ne souhaitez pas déclarer toutes les liaisons, vous pouvez également essayer cet adaptateur:
guice-bridge-jit-injector
la source
Pour moi, cela fonctionne sans le
AbstractBinder
si j'inclus les dépendances suivantes dans mon application Web (fonctionnant sur Tomcat 8.5, Jersey 2.27):Cela fonctionne avec CDI 1.2 / CDI 2.0 pour moi (en utilisant respectivement Weld 2/3).
la source
Dépendance requise pour le service reposant du maillot et Tomcat est le serveur. où $ {jersey.version} est 2.29.1
Le code de base sera le suivant:
la source