JCDI (Java™ Contexts and
Dependency Injection) prend en charge l'injection de dépendance dans des beans gérés. En configurant votre application Web pour JCDI, vous pouvez ajouter des zones et des propriétés annotées @javax.inject.Inject. Si les zones et propriétés annotées sont des points d'injection corrects avec des beans gérés JCDI valides, leurs dépendances seront résolues en phase d'exécution. L'injection de dépendance sépare la création d'instances de types Java de l'utilisation de ces types Java dans le code. L'injection de dépendance permet de simplifier le test du code tout en améliorant la capacité à gérer les applications.
Pourquoi et quand exécuter cette tâche
Dans cette tâche, vous allez configurer votre application pour utiliser JCDI
en ajoutant un descripteur de déploiement beans.xml.
Vous créerez ensuite un type de ressource JAX-RS (Java API
for RESTful Web Services) standard avec une zone @javax.inject.Inject qui sera résolue lors de l'exécution.
Les instructions suivantes expliquent comment créer une application Web compatible JCDI simple avec JAX-RS :
Procédure
- Ajoutez un descripteur de déploiement beans.xml à votre fichier WAR d'application Web dans le répertoire WEB-INF. Cela indique que l'application Web doit être compatible avec JCDI. L'existence du fichier WEB-INF/beans.xml indique que l'archive est une archive JCDI. Vous n'avez pas besoin d'ajouter des informations supplémentaires au descripteur de déploiement pour cette tâche. L'exemple suivant illustre un fichier WEB-INF/beans.xml de base :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance" xsi:schemeLocation="http://java.sun.com/xml/ns/javaee http://
java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<!-- This is empty on purpose. -->
</beans>
- Créez une classe de ressources racine JAX-RS. L'exemple suivant illustre une classe de ressources racine JAX-RS simple :
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
public class StringResource {
public StringResource() {
/* use a no-argument constructor */
}
@javax.ws.rs.core.Context
private javax.ws.rs.core.HttpHeaders httpHeaders;
@javax.annotation.PostConstruct
private void myPostConstruct() {
/* read from the httpHeaders if required */
}
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
Dans le code précédent, un constructeur sans argument a été utilisé. Un constructeur sans argument est un constructeur JCDI valide qui transforme la classe en bean JCDI valide. Si vous souhaitez injecter des objets ou des paramètres contextuels JAX-RS lors de l'instanciation d'objet, vous pouvez utiliser des zones ou des propriétés de bean. Utilisez ensuite une méthode annotée @javax.annotation.PostConstruct qui est appelée une fois l'objet construit.
- Ajoutez une portée de cycle de vie JCDI à vos classes JAX-RS. L'exemple suivant illustre une classe de ressources racine JAX-RS avec une annotation de portée @javax.enterprise.context.RequestScoped :
Pratiques recommandées: Ajoutez l'annotation
@javax.enterprise.context.RequestScoped à vos classes de ressources racine pour faire en sorte que votre classe de ressources racine JAX-RS n'ait qu'une seule instance par demande. Il s'agit du comportement par défaut dans les applications non JCDI.
bprac
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
@javax.enterprise.context.RequestScoped
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
- Créez une classe qui est injectée dans la ressource racine JAX-RS. L'exemple suivant illustre une classe Java standard :
package com.example.jaxrs;
public class Data {
public String getData() {
return "Hello world!";
}
}
- Modifiez votre ressource racine JAX-RS pour ajouter une zone annotée @javax.inject.Inject pour le type com.example.jaxrs.Data. L'exemple suivant illustre une classe de ressources racine JAX-RS modifiée avec un point d'injection @javax.inject.Inject :
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
@javax.enterprise.context.RequestScoped
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return myData.getData();
}
@javax.inject.Inject
private Data myData;
}
En phase d'exécution, lorsque la ressource racine JAX-RS est construite, une instance du type Data est injectée dans la zone myData. Il s'agit d'un type simple d'injection. JCDI permet des scénarios d'utilisation plus complexes. Pour plus d'informations, lisez la spécification JCDI.
- Ajoutez un fichier web.xml de Servlet 3.0 à votre fichier WAR. Dans l'exemple suivant, une définition de servlet d'application JAX-RS par défaut qui rend disponibles toutes les ressources racine JAX-RS du masque d'URL /rest/* est ajoutée :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/
j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Résultats
Vous avez configuré une application Web pour utiliser JCDI, créé une ressource JAX-RS avec une portée de cycle de vie JDCI et créé un point d'injection standard.