Resteasy / Weld / Tomcat7

25 janvier 2015 08:56 root Java, Resteasy, Tomcat, Weld

Ajourd'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.

par Shionn, dernière modification le 24 février 2015 08:18
2 réflexions au sujet de « Resteasy / Weld / Tomcat7 »
  • Franck Arnulfo 24 février 2015 00:25

    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 ;-)

  • Shionn 24 février 2015 08:22

    OMG, un commentaire de Franck, j'ai passé un des premiers boss des internets. Merci c'est corrigé.

Laissez un commentaire

Vous pouvez utilisez du markdown pour la mise en forme

Votre adresse de messagerie ne sera pas publiée.

Temporairement, pour lutter contre les bots, il n'est pas permis de mettre http:// dans le commentaire.