Dans un des premiers billets sur ce blog, je montrais comment démarrer Jersey en mode autonome, avec Grizzly, avec un peu de JRebel. J'ai voulu faire une mise en place similaire avec RESTEasy, l'implémentation de JAX-RS de JBoss.

RESTEasy n'a pas de mode autonome, il doit être utilisé avec un serveur Web. Il est intégré en standard dans WildFly, mais peut aussi être intégré à d'autres serveurs, comme Tomcat, Undertow ou le serveur Web du JDK d'Oracle. J'aime bien cette dernière possibilité car elle ne nécessite pas d'installation supplémentaire et donc peut facilement être utilisée pour un prototype ou pour des tests.


La première étape est la définition de mon classpath. Dans mon fichier pom.xml, je déclare des dépendances vers org.jboss.resteasy:resteasy-jaxrs et org.jboss.resteasy:resteasy-jdk-http. La première est le coeur de RESTEasy avec l'API JAX-RS et la seconde est l'extension permettant l'intégration avec le serveur Web du JDK. Je ne les ai pas mis ici, mais j'ai aussi ajouté des dépendances vers les providers pour le support de JSON (org.jboss.resteasy:resteasy-jackson-provider) et celui des listes (org.jboss.resteasy:resteasy-jaxb-provider).

<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jdk-http</artifactId>
<version>${resteasy.version}</version>
</dependency>
<!-- ... -->
</dependencies>

L'étape suivante est la création d'une classe de démarrage avec une méthode main. Dans cette méthode, on initialise le HttpServer du JDK, en l'associant à REASTEasy grâce à la classe HttpContextBuilder fournie par l'extension.

Dans l'extrait de code ci-dessous, seule la classe HttpContextBuilder vient de REATEasy. Sa méthode bind() initialise et configure le moteur JAX-RS, associe les classes de ressources JAX-RS et passe tout ça dans un handler de HttpServer. 

    HttpServer server = HttpServer.create(new InetSocketAddress(7000), 1);
HttpContextBuilder contextBuilder = new HttpContextBuilder();
contextBuilder.getDeployment()
.getActualResourceClasses()
.add(TextEndpoint.class);
HttpContext context = contextBuilder.bind(server);
server.start();

L'unique ressource référencée est MessageEndpoint que j'ai implémentée et qui répond aux requêtes GET pour récupérer un message unique ou tous les messages. Vous pourrez retrouver son code source sur Github, avec l'exemple complet.

HttpServer est démarré, en écoute sur le port 7000. On peut tester avec cURL :

curl -w "\n" -H "accept:application/json" http://localhost:7000/message/1

ou

curl -w "\n" -H "accept:application/json" http://localhost:7000/message
Voilà, mon serveur JAX-RS est en place. La prochaine étape sera d'englober ça dans une Rule pour jUnit, afin d'utiliser mon serveur dans des tests.