87 votes

Pourquoi utiliser JAX-RS / Jersey ?

Désolé, cette question peut paraître stupide, mais après avoir développé certains de mes services RESTful en utilisant Jersey, je me suis posé la question suivante : si REST est juste une architecture, et non un protocole comme SOAP, pourquoi avons-nous besoin d'une spécification comme JAX-RS ?

En fait, j'ai cherché sur Google des questions comme "Quelle est la différence entre les servlets et les services RESTful sur HTTP" et pour résumer les réponses de la communauté, j'ai obtenu :

  1. Le développement de services RESTful (sur Jersey) est une architecture qui utilise intrinsèquement les servlets.
  2. Les outils conformes à JAX-RS, comme Jersey, facilitent le regroupement et le désassemblage des données XML/JSON, ce qui aide les développeurs.
  3. REST nous aide à utiliser GET/POST/PUT/DELETE d'une manière bien plus efficace que les servlets normaux.

Selon ces réponses, je suppose que si j'écris une servlet qui utilise JAXB (pour traiter la sérialisation automatique), et que j'utilise efficacement GET/POST/PUT/DELETE dans mon code de servlet, je n'utilise pas un outil comme Jersey, et donc JAX-RS.

Je sais que je me trompe terriblement en passant cette déclaration, veuillez me corriger.

PS : Ce doute est apparu lorsque j'ai dû développer des services RESTful en PHP. Après avoir parcouru certains codes PHP RESTful, j'ai réalisé qu'il s'agissait simplement des mêmes vieux scripts PHP, avec quelques méthodes d'aide pour gérer XML/JSON.

0 votes

Merci pour toutes vos réponses. Mais quelqu'un peut-il répondre à ma première question ? Pourquoi avons-nous besoin d'une spécification pour une "architecture"... peut-être quelqu'un peut-il m'indiquer une autre architecture qui fournit une spécification formelle ?

0 votes

Vous cherchez autre chose que la simplicité (quelques lignes de code) et la portabilité (déploiement sur GlassFish, WebLogic, WebSphere, JBoss, etc.) ? Vous pouvez développer un service RESTful en utilisant des spécifications de niveau inférieur comme Servlets/JAXP/JDBC, mais cela implique généralement plus de code que les spécifications de niveau supérieur comme JAX-RS/JAXB/JPA.

73voto

Blaise Doughan Points 75613

Pourquoi utiliser JAX-RS / Jersey ?

Réponse courte

Parce qu'il facilite le développement de services RESTful.

Réponse longue

JAX-RS est une norme qui permet de créer facilement un service RESTful pouvant être déployé sur n'importe quel serveur d'application Java : GlassFish, WebLogic, WebSphere, JBoss, etc.

JAX-RS fait partie de Java EE, et lorsque JAX-RS est utilisé avec d'autres technologies Java EE, il devient encore plus facile de créer votre service RESTful :

  • EJB - Un haricot de session est utilisé pour la mise en œuvre du service et gère également la sémantique des transactions.
  • JAX-RS - Utilisé pour exposer le haricot de session comme un service RESTful.
  • JPA - Utilisé pour faire persister les POJOs dans la base de données. Notez comment l'EntityManager est injecté dans le session bean.
  • JAXB - Utilisé pour convertir le POJO en/depuis XML (dans GlassFish, il peut également être utilisé pour convertir le POJO en/depuis JSON). JAX-RS gère par défaut l'interaction avec l'implémentation JAXB.

Exemple de service JAX-RS

package org.example;

import java.util.List;

import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {

    @PersistenceContext(unitName="CustomerService",
                        type=PersistenceContextType.TRANSACTION)
    EntityManager entityManager;

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public void create(Customer customer) {
        entityManager.persist(customer);
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("{id}")
    public Customer read(@PathParam("id") long id) {
        return entityManager.find(Customer.class, id);
    }

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public void update(Customer customer) {
        entityManager.merge(customer);
    }

    @DELETE
    @Path("{id}")
    public void delete(@PathParam("id") long id) {
        Customer customer = read(id);
        if(null != customer) {
            entityManager.remove(customer);
        }
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("findCustomersByCity/{city}")
    public List<Customer> findCustomersByCity(@PathParam("city") String city) {
        Query query = entityManager.createNamedQuery("findCustomersByCity");
        query.setParameter("city", city);
        return query.getResultList();
    }

}

Pour plus d'informations :

0 votes

Le terme "session bean" est trompeur ici. Comme le montre votre code, le point de terminaison RESTful est censé être sans état. Il n'y a pas de session conservée.

0 votes

Donc, JAX-RS est plus favorable à XML selon votre réponse que la conversion JSON est seulement disponible avec le serveur GlassFish ? Merci

0 votes

Quelqu'un peut-il commenter la différence avec Springboot ? Pourquoi utiliser l'un plutôt que l'autre ? Merci

59voto

Don Roby Points 24965

REST est une architecture qui, par nature, utilise des servlets.

Non, ce n'est pas le cas. REST est un style d'architecture qui peut être mis en œuvre à l'aide de servlets, mais qui ne les utilise pas intrinsèquement et qui n'a rien à voir avec Java.

JAX-RS est une spécification JSR définissant une API Java pour les services Web RESTful.

Jersey est une implémentation spécifique de JAX-RS.

Quant à savoir s'il faut utiliser Jersey ou essayer de se conformer à la spécification JAX-RS, c'est à vous de voir. Si cela facilite votre travail, tant mieux ! Sinon, personne ne vous y oblige.

12 votes

+1 Note supplémentaire : l'utilisation de JAX-RS est presque garantie comme étant beaucoup plus facile que de déployer votre propre implémentation ReSTful en utilisant des servlets. C'est là tout l'intérêt.

0 votes

@Ryan, Don : C'est tout l'objet de cette question - Avons-nous besoin de Jersey uniquement pour faciliter les activités mentionnées ci-dessus. Et je sais ce qu'est JAX-RS, je veux juste savoir pourquoi les gens de Java offrent une API séparée pour cela... PHP n'en a pas offert et pourtant ils s'en sortent bien, semble-t-il.

7 votes

@WinOrWin : Nous pourrions tout faire en assembleur, aussi, alors pourquoi utiliser Java ? Tout ce que je peux dire, c'est d'écrire une API ReSTful dans les deux sens, et de décider ce que vous voulez faire encore et encore.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X