Resteasy

Resteasy / Weld / Tomcat7

25 January 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.

Le web dont vous êtes le héros @HumanTalk Geneve

16 March 2014 09:02 root Bootstrap, HumanTalks, Java, jQuery, livre dont vous êtes le heros, Resteasy

Voici la vidéo de la présentation que j'ai faite à HumanTalk Genève mercredi dernier. Cette présentation parle du portage en application web d'un projet personnel en utilisant les technos à la mode :]

Ressource : Slide en pdf de la présentation.

[youtube]https://www.youtube.com/watch?v=NBMct7-lneo[/youtube]

 

 

Rest sur Tomcat, Leçon 3 : Persistance avec OpenJPA

18 August 2013 14:27 root Java, MySQL, OpenJPA, Resteasy, Tomcat

Bonjour.

Dans le précédent article, les messages posté était enregistrer dans une simple List. Aujourd'hui on va voir comment enregistrer ces messages dans une base de donnée MySQL à l'aide d'OpenJPA.

Ajout d'OpenJPA au pom.xml

J'ai vraiment horreur de maven, mais bon. Commençons donc par ajouté OpenJPA et un connecteur Jdbc au projet.

<dependency>
  <groupId>org.apache.openjpa</groupId>
  <artifactId>openjpa-all</artifactId>
  <version>2.2.2</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.25</version>
  <scope>runtime</scope>
</dependency>

Création du fichier persistance.xml

à placer dans /src/main/webapp/WEB-INF/classes/META-INF. Ce fichier permet de définir à la fois la connexion à la base de donnée, mais également la liste des beans accessible par OpenJPA. Ici la configuration est faite de manière à ce que les table soit généré automatiquement.

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
  <persistence-unit name="tuto-bdd" transaction-type="RESOURCE_LOCAL">
    <class>bean.Message</class>
    <properties>
      <property name="openjpa.ConnectionURL"
value="jdbc:mysql://localhost:3306/YOUR_BDD?autoReconnect=true" />
      <property name="openjpa.ConnectionUserName" value="YOUR_LOGIN" />
      <property name="openjpa.ConnectionPassword" value="YOUR_PASS" />
      <property name="openjpa.ConnectionDriverName" value="org.gjt.mm.mysql.Driver" />
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
      <property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
    </properties>
  </persistence-unit>
</persistence>

Décoration du bean

Maintenant il faut décorer notre précédent bean pour lui permettre d'être enregistrer en BDD. Rien de bien sorcier la non plus. On ajoute au passage un identifiant unique avec une valeur auto générée.

@Entity
public class Message {

    @Id
    @GeneratedValue
    private long id;

    [...]

    public long getId() {
        return id;
    }

}

Rest sur Tomcat, Leçon 2 : Un service de message.

11 August 2013 15:51 root Java, Json, Resteasy, Tomcat

Bonjour,

Voici la suite de ce tutorial, aujourd'hui on va voir comment ajouter un service de gestion de message en Json. Comment interagir avec ce service à l'aide d'un client Rest comme Rest-Console pour chromiun. Et dans le prochain article on verra comment sérialiser ces données dans une base de donnée à l'aide d'OpenJPA.

Ecriture du bean

Rien de bien sorcier. Ici je souhaite que la date soit automatiquement renseigné lors de la creation du bean. Ca m'évitera de la remplir depuis le client.

public class Message {

    private Date creation = new Date();

    private String message;

    public Date getCreation() {
        return creation;
    }

    public void setCreation(Date creation) {
        this.creation = creation;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

Ecriture du service

Les beans sont enregistré dans une simple liste en static pour l'instant. Plus tard on passera par une base de donnée mais c'est une autre histoire. Deux services sont déclarés. Le premier permet d'ajouter un message, et renvoie le message sauvegardé. L’intérêt est d'avoir dans la réponse les éventuels modification qui ont lieux lors de la création, ici simplement la date de création. Le second service lui renvoie la liste des messages, tous simplement.

@Path("/messages")
public class MessageService {

    private static final List<Message> MESSAGES = new ArrayList<Message>();

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Message postMessage(Message message) {
        MESSAGES.add(message);
        return message;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Message> getMessages() {
        return MESSAGES;
    }

}

Envoie d'un post avec Rest-Console

Pour tester mes services rest j'utilise Rest-Console, une application pour chromiun, mais vous trouverez facilement son équivalent pour firefox.

Tous d'abord, un post pour créer le bean. [gallery ids="1749"] Vous avez comme réponse : [gallery ids="1750"] Et maintenant si vous fait un get vous aurez comme réponse : [gallery ids="1752"] A bientôt pour un prochain article avec la sérialisation JPA.

Rest sur Tomcat, Leçon 1 : Introduction

04 August 2013 06:57 root Java, Maven, Resteasy, Tomcat

Bonjour,

Je commence aujourd'hui une série de tutorial dans le but de faire des services web orienté Rest sur Tomcat. Ici je prendrais le choix d'utiliser principalement Json comme format d’échange mais pour du XML la procédure change peu. J'ai choisi comme implémentation :

  • Resteasy : pour le provider rest
  • Jackson : pour la serialisation Json
  • Tomcat : pour le serveur
Je ne vais pas pas vous faire l'affront de vous expliqué le principe de REST. Je l'ai appris de manière empirique et si par le plus grand des hasard vous êtes arrivé sur cette page c'est que vous savez déjà ce que c'est.

Ecriture du pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>shionn</groupId>
  <artifactId>tuto-resteasy</artifactId>
  <version>0.1</version>
  <name>ResteasyTuto</name>
  <packaging>war</packaging>

<dependencies> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson-provider</artifactId> <version>3.0.2.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.0.2.Final</version> </dependency> </dependencies> </project>

Ecriture du web.xml

à placer dans src/main/webapp/WEB-INF. L'idée est de faire en sorte que resteasy détecte tous seul les services.

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Resteasy Tuto</display-name>

  <context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/</param-value>
  </context-param>

  <listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>

  <servlet>
  <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

Ecriture de du premier service REST

C'est assez simple il suffit de créer une classe en l'annotant avec la balise @Path("/chemin"). Cela déclare la classe auprès de resteasy. Cette classe prendra en charge les requêtes arrivant sur le chemin "/chemin"

Et c'est la même idée avec les méthodes, avec les annotation en décrit le contenu qu'elle consomme, produit etc... Voila l'exemple le plus simple.