Resteasy / Weld / Tomcat7
25 January 2015 08:56 rootAjourd'hui, je vous propose un tous petit tuto pour se lancer sur les services Rest avec RestEasy sur Tomcat7 mais cette fois-ci avec de l'injection via Weld.
pom.xml
Commençons par le pom.xml. Voici les dépendances qu'il vous faut :<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.0.10.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-cdi</artifactId> <version>3.0.10.Final</version> </dependency> <dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet</artifactId> <version>2.2.8.Final</version> </dependency>
web.xml
Voici in exemple de configuration fonctionnel pour le web.xml. Je reviendrais plus tard sur la class shionn.tuto.Services.<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/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>Tuto</display-name> <!-- déclaration de l'injection --> <listener> <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> </listener> <resource-env-ref> <resource-env-ref-name>BeanManager</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> </resource-env-ref> <context-param> <param-name>resteasy.injector.factory</param-name> <param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value> </context-param> <!-- déclaration de RestEasy --> <servlet> <servlet-name>Resteasy</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>shionn.tuto.Services</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
beans.xml
Pour que l'injection fonctionne, il faut définir un fichier beans.xml dans le dossier WEB-INF, sinon cela ne marche pas.<?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:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>
Code
La classe shionn.tuto.Services que nous avons définit dans le web.xml, doit hériter de javax.ws.rs.core.Application. On peu surcharger deux méthodes getClasses() et getSingletons(), revoyant les classes se chargeant des services webs. Voici un exemple avec un service HelloWorld.public class Services extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(HelloWorld.class);
return classes;
}
}
Ajoutons un service HelloWorld avec un objet Message injecté.
@Path("hello") public class HelloWorld { @Inject private Message message; @Get public String getMessage() { return message.get(); } } @Named public class Message { public String get() { return "HelloWorld Injected !"; } }
Et voila :] Je sais combien il peu parfois être frustrant de tourner en rond dans les configurations aussi j’espère que cela vous aidera.
Petite remarque : l'élément XML load-on-startup doit être placé après l'élément init-param pour être conforme au XSD (http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_0.xsd).
Vu avec Netbeans qui valide le xml avec son xsd ;-)
OMG, un commentaire de Franck, j'ai passé un des premiers boss des internets. Merci c'est corrigé.