BT

Diffuser les Connaissances et l'Innovation dans le Développement Logiciel d'Entreprise

Contribuez

Sujets

Sélectionner votre région

Accueil InfoQ Actualités Quelles nouveautés pour JAX-RS 2.0 ?

Quelles nouveautés pour JAX-RS 2.0 ?

Quand JAX-RS a été dévoilé pour la première fois en 2008 par les pilotes de la spécification JSR-311, Marc Hadley et Paul Sandoz, il est devenu un des premiers frameworks basés sur des POJO et des annotations pour créer des applications web robustes.

Aujourd'hui, 5 ans plus tard, JavaEE 7 vient de sortir et inclut la dernière version 2.0 de JAX-RS, qui est le résultat du travail sur la JSR-339 conduit par Marek Potociar et Santiago Pericas-Geertsen. Nous verrons quelques fonctionnalités de cette version 2.0 de JAX-RS qui rendent la mise à jour intéressante, mais d'abord récapitulons rapidement ce qu'était JAX-RS 1.0

  @Path(portfolios) 
  public class PortfolioResource { 

    @GET 
    public Collection<Portfolio> allPortfolios() { 
      . . . 
    } 

    @GET 
   public Portfolio getPortfolio(
         @PathParam("portfolioId") String id) { 
     . . .
   }
 }

Dans le code ci-dessus, la ligne 1 nous dit d'associer cette ressource au chemin relatif /portfolios. La ligne 4 dit qu'une requête GET doit retourner tous les portfolios. Les lignes 9 et 10 indiquent qu'une requête GET avec, par exemple, l'URI /portfolios/123 doit extraire le paramètre (ici 123) qui suit l'URI (ici /portfolios/), et l'assigner à la variable id, puis retourner le portfolio associé.

Cette syntaxe reste inchangée dans JAX-RS 2.0.

Pour être consistant avec le thème central de Java EE 7, JAX-RS 2.0 ajoute quelques fonctionnalités très attendues, la plupart autour de ce qu'Oracle appelle ses "API simplifiées".

Ces fonctionnalités peuvent être classées comme suit :

  • API Cliente
  • Asynchronisme
  • HATEOAS (Hypermedia)
  • Annotations
  • Validation
  • Filtres et gestionnaires
  • Négociation de contenu

Nous allons maintenant faire un tour rapide de chacune de ces catégories.

API Client

JAX-RS 1.0 était exclusivement une API serveur. Certaines implémentations fournissaient, à des degrés divers, un support côté client, mais généralement le développeur se retrouvait obligé d'installer une librairie dédiée comme Jakarta Commons HttpClient de la Fondation Apache, ou bien WizTools REST Client.

JAX-RS apporte une API "fluent" pour appeler un service Web depuis le client. Voici un exemple :

  Client client=ClientFactory.newClient();
  String shares=client.target("http://.../portfolio/123")
      .pathParam("identifier", "IBM")
      .queryParameter("identifierType", "ticker")
      .request("text/plain).get(String.class");

Vous pouvez voir que cette méthode obtient d'abord un client, et utilise ensuite le patron de conception "builder" pour ajouter tous les paramètres de l'URL, ce qui permet au développeur de produire une URL sans se préoccuper des particularités de sa construction.

Cette approche est particulièrement utile pour les requêtes HTTP avec un corps, tels qu'un HTTP POST ou un HTTP PUT. L'exemple qui suit permet à l'application de vendre 100 actions IBM.

Stock stock=client.target("http://.../portfolio/123/sell")
        .pathParam("identifier", "IBM")
        .queryParameter("identifier", "ticker")
        .request("application/json")
        .post(text("100", Shares.class));

Asynchronisme

Dans JAX-RS 1.0, un appel client devait attendre la réponse du serveur, la version 2.0 introduit l'asynchronisme. Cela permet à un client de faire un appel REST, et optionnellement d'obtenir un Future ou bien de notifier une InvocationCallback de l'arrivée d'une réponse.

HATEOAS (Hypermedia)

Si on suit les préceptes RESTafariens à la lettre : si vous n'utilisez pas HATEOAS, alors vous ne faites pas de REST! HATEOAS (Hypermedia as the Engine of Application State, liens hypermedia comme moteur de l'état de l'application) exige que les producteurs et les consommateurs REST s'accordent sur un ensemble de liens qui seront retournés à chaque appel, et permettront de naviguer vers l'étape suivante. Autrement dit, REST est aux pages web ce que HATEOAS est aux liens hypertextes contenus dans les pages webs.

JAX-RS 2.0 fournit des classes Link et Target pour mettre des hyperliens dans les réponses du serveur et réagir en conséquence côté client.

Annotations

De nouvelles annotations ont été introduites pour, par exemple, supporter de nouveaux types d'injection.

Bean Validation

Il s'agit d'un outil basé sur des annotations pour spécifier des méta-données sur les paramètres. Par exemple, @NotNull int shares indique que le paramètre shares ne doit pas être nul. Vous pouvez aussi fournir vos propres annotations personnalisées pour valider des formats de données spécifiques comme un code postal ou un numéro de téléphone.

Filtres et gestionnaires

L'API des filtres (Filters) permet de chaîner les filtres de servlet dans un patron de conception "chaîne de responsabilité". Ceci est utile pour traiter des problématiques transverses comme la journalisation (logging). N'importe quel filtre peut décider de poursuivre ou d'arrêter la chaîne en appelant respectivement FilterAction.NEXT ou FilterAction.STOP.

Les Gestionnaires (Handlers) sont similaires aux filtres sauf qu'ils enveloppent une invocation de méthode en un point d'extension donné. Ceci est utile pour intercepter les appels en ce point d'extension pour, par exemple, transformer ou enrichir les données en entrée/sortie.

Négociation de contenu

De nouvelles annotations @Accepts et @Produces vous permettent de prioriser le format des requêtes/réponses.

Il manque toujours à JAX-RS un bon modèle de sécurité, ce qui rend difficile l'exposition de services REST à l'extérieur de l'entreprise. Nous espérons que la prochaine version fournira l'outillage nécessaire à une authentification point à point.

Il faudra certainement un peu de temps avant que les principaux conteneurs JEE supportent JAX-RS 2.0. En attendant vous pouvez vous en servir dans votre application en vous appuyant sur la dernière version de Jersey. Oracle a publié une explication détaillée pour l'utiliser dans WebLogic 12c.

Pour plus d'information, lisez l'article sur OTN Java EE 7 et JAX-RS 2.0 par l'un des membres du groupe d'expert de la JSR 339 Adam Bien.

Evaluer cet article

Pertinence
Style

Contenu Éducatif

BT