Perché usare JAX-RS / Jersey?


85

Mi spiace, questa domanda sembra sciocca, ma dopo aver sviluppato alcuni dei miei servizi RESTful utilizzando Jersey, mi sono posto la domanda: se REST è solo un'architettura e non un protocollo come SOAP, perché abbiamo bisogno di una specifica come JAX-RS?

In realtà ho cercato su Google domande come "Qual è la differenza tra servlet e servizi RESTful su HTTP" e per riassumere le risposte della comunità, ho ottenuto:

  1. Lo sviluppo di servizi RESTful (su Jersey) è un'architettura che utilizza intrinsecamente servlet.
  2. Strumenti conformi a JAX-RS come Jersey forniscono un facile marshalling-unmarshalling dei dati XML / JSON, aiutando gli sviluppatori.
  3. REST ci aiuta a usare GET / POST / PUT / DELETE in un modo che è molto efficiente rispetto ai normali servlet.

Secondo queste risposte, immagino che se scrivo un servlet che utilizza JAXB (per gestire la serializzazione automatica) e utilizzo in modo efficiente GET / POST / PUT / DELETE nel mio codice servlet, non utilizzo uno strumento come Jersey, e quindi JAX-RS.

So di sbagliarmi terribilmente nel far passare questa affermazione, per favore correggimi.

PS: Questo dubbio in realtà è venuto quando ho dovuto sviluppare alcuni servizi RESTful in PHP. Dopo aver esaminato alcuni dei codici PHP RESTful, mi sono reso conto che sono gli stessi vecchi script PHP, con alcuni metodi di supporto per la gestione di XML / JSON.


Grazie per tutte le tue risposte. Ma qualcuno può rispondere al mio primo punto? Perché abbiamo bisogno di una specifica per una "architettura" ... forse qualcuno può semplicemente indicarmi qualsiasi altra architettura che fornisce una specifica formale?
WinOrWin

Stai cercando un motivo in più oltre alla semplicità (poche righe di codice) e alla portabilità (distribuire su GlassFish, WebLogic, WebSphere, JBoss, ecc.)? È possibile sviluppare un servizio RESTful utilizzando specifiche di livello inferiore come Servlet / JAXP / JDBC, ma questo generalmente implica più codice rispetto a specifiche di livello superiore come JAX-RS / JAXB / JPA.
bdoughan

Risposte:


72

Perché usare JAX-RS / Jersey?

Risposta breve

Perché semplifica lo sviluppo di servizi RESTful.

Risposta lunga

JAX-RS è uno standard che semplifica la creazione di un servizio RESTful che può essere distribuito su qualsiasi server di applicazioni Java: GlassFish, WebLogic, WebSphere, JBoss, ecc.

JAX-RS fa parte di Java EE e quando JAX-RS viene utilizzato con altre tecnologie Java EE diventa ancora più semplice creare il tuo servizio RESTful:

  • EJB - Un bean di sessione viene utilizzato come implementazione del servizio e gestisce anche la semantica della transazione.
  • JAX-RS : utilizzato per esporre il bean di sessione come servizio RESTful
  • JPA : utilizzato per rendere persistenti i POJO nel database. Notare come EntityManager viene iniettato nel bean di sessione.
  • JAXB - Usato per convertire il POJO in / da XML (in GlassFish può anche essere usato per convertire il POJO in / da JSON). JAX-RS per impostazione predefinita gestisce l'interazione con l'implementazione JAXB.

Servizio JAX-RS di esempio

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

}

Per maggiori informazioni:


Il termine "bean di sessione" qui è fuorviante. Come mostra il codice, l'endpoint RESTful dovrebbe essere senza stato. Non viene tenuta alcuna sessione.
phi

Quindi, JAX-RS è più compatibile con XML in base alla tua risposta che la conversione JSON è disponibile solo con il server GlassFish? Grazie
pixel

Qualcuno potrebbe commentare la differenza con Springboot? Perché usarne uno sull'altro? Grazie
pixel

58

REST è un'architettura che utilizza intrinsecamente servlet.

No non lo è. REST è uno stile di architettura che può essere implementato utilizzando servlet, ma non li utilizza intrinsecamente, né ha intrinsecamente nulla a che fare con Java.

JAX-RS è una specifica JSR che definisce un'API Java per i servizi Web RESTful.

Jersey è un'implementazione specifica di JAX-RS.

Quanto all'opportunità di utilizzare Jersey o cercare di essere conforme alle specifiche JAX-RS, dipende da te. Se ti semplifica il lavoro, bene! Altrimenti nessuno ti costringe.


12
+1 Nota aggiuntiva: l'utilizzo di JAX-RS è quasi garantito per essere molto più semplice che eseguire il rollio della propria implementazione ReSTful utilizzando i servlet. Questo è il punto centrale.
Ryan Stewart

@ Ryan, Don: Questo è l'intero scopo di questa domanda: abbiamo bisogno del Jersey solo per facilitare le attività di cui sopra. E so cos'è JAX-RS, voglio solo sapere perché le persone Java offrono un'API separata per questo ... PHP non ne ha offerta nessuna e sembra che stiano ancora andando bene.
WinOrWin

7
@ WinOrWin: potremmo fare tutto anche in assembly, quindi perché usare Java? Tutto quello che posso dire è scrivere un'API ReSTful in entrambi i modi, e decidere cosa fare più e più volte.
Ryan Stewart
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.