JAX-RS: di cosa si occupa esattamente l'implementazione Jersey?

di il
4 risposte

JAX-RS: di cosa si occupa esattamente l'implementazione Jersey?

Ciao a tutti,

ho da poco approcciato al mondo dei servizi RESTfull e scusatemi in anticipo se sto per esporre un quesito banale per molti ma sono un po' confuso.

Ho letto diverse guide su JAX-RS e mi è chiaro il fatto che sia solo una specifica che consiste in un insieme di interfacce ed annotazioni definite nel package javax.ws.rs e che esistono poi diverse implementazioni (es. Jersey, RESTEasy, ecc…), ma non mi è ben chiaro cosa fanno esattamente queste implementazioni.

Cerco di spiegarmi meglio con un esempio.

Di seguito alcune informazioni in merito al mio progetto Eclipse:

  • Nome progetto: WebAppTest
  • Project Facets
    • Dynamic Web Module: 3.1
    • Java: 1.8
    • JAX-RS: 2.0
  • Tomcat: 8.5

Maven

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1.1</version>
</dependency>

Risorsa

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String sayJsonHello() {
        return "{\"name\":\"greeting\", \"message\":\"Hello world!\"}";
    }
}

Applicazione REST

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class RestApplication extends Application {

}

Se provo ad eseguire la chiamata curl http://localhost:8080/WebAppTest/rest/hello, ottengo l'errore 404 - Not found.

Se sostituisco la dipendenza maven javax.ws.rs (indicata sopra) con la seguente dipendenza Jersey

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.25.1</version>
</dependency>

il servizio risponde correttamente e ritorna il mio JSON

{"name":"greeting", "message":"Hello world!"}

La cosa che non mi è chiara è: se nelle mie classi sto utilizzando solo annotazioni/interfacce/classi che si trovano nel package javax.ws.rs, perché il servizio non risponde senza la dipendenza Jersey?

Nella mia ignoranza, visto che Jersey è un implementazione, mi aspettavo di dover importare ed utilizzare, in una delle mie classi, almeno un annotazione/interfaccia/classe del package Jersey, ma così non è.

Quindi mi chiedo, cosa fa esattamente il package Jersey per “far funzionare” il servizio?

Spero di essere stato chiaro nell'esporre il quesito.

Grazie in anticipo.

MM

4 Risposte

  • Re: JAX-RS: di cosa si occupa esattamente l'implementazione Jersey?

    JAX-RS e' una “specifica” che indica COME devono essere annotate le classi e COME devono essere utilizzate da un'EVENTUALE framework che la implementa.

    E' un po' come dire: la tua classe, per POTER ESSERE USATA dal framework DEVE AVERE queste “maniglie” (tipo maniglie della porta) fatte in QUESTO modo (ogni “annotazione” indica un particolare tipo di “maniglia”).

    Ora, la tua classe ha le manigli.

    Problema: CHI USA queste maniglie?

    Serve un'altro “marchingegno” che si occupa di TUTTO quello che serve per 

    1. fare la connessione TCP/IP, 
    2. convertirte lo stream HTTP PRIMA in JSON 
    3. e POI il JSON nella corrispondente classe Java, 
    4. quindi trovare la TUA classe  con le annotazioni che deve gestire la richiesta HTTP (e le annotazioni servono tra l'altro per dire a quali richieste la classe deve rispondere, e il framework e' abbastanza intelligente da capire quale e' quella che fa al caso)
    5. passare l'oggetto java alla classe
    6. ottenere il risultato
    7. convertire il risultato in JSON
    8. spedire il risultato sul canale HTTP

    E questo SOLO per darti ‘un’idea “generale”.

    Chi fa tutto questo? Tomcat NON BASTA perche Tomcat si occupa SOLO della connessione HTTP e della gestione delle URL. Serve qualcun altro. Questo e' Jersey, marchingegno che sin integra con Tomcat (in modi vari). Anche qui ci sono n-mila configurazioni possibili

    1. Jersey usa un'implementazione minimale di Tomcat per la gestione della connessione HTTP OPPURE
    2. Tomcat INTEGRA Jersey (nel qual caso il su mini-Tomcat non viene usato)

    .

    Non e' difficile, ma serve un po' per “raccapezzarci”.

    Poi ci sono n-mila dettagli spiccioli che se non vengono seguiti alla lettera, fanno si che non funzioni una “cippa” e non si capisca perche' ;-)

    Ti conviene appoggiarti a qualche BUON libro della O'Reilly e partire dagli esempi PIU' SEMPLICI e poi via via analizzare quelli piu' complicati.

    Parti da del codice GIA' FUNZIONANTE.

  • Re: JAX-RS: di cosa si occupa esattamente l'implementazione Jersey?

    Grazie per le informazioni, la situazione è già molto più chiara adesso.

    Approfitto per chiederti anche se è possibile implementare un servizio RESTful, seguendo le specifiche JAX-RS, ma senza l'utilizzo di nessuna delle implementazioni già esistenti.

    Lo so che potrebbe essere un suicidio, ma forse portrebbe aiutarmi a capire meglio alcune logiche.

    Grazie ancora.

    MM

  • Re: JAX-RS: di cosa si occupa esattamente l'implementazione Jersey?

    Impraticable.

    Il numero di “programmatori esperti” (10/20 o piu' anni di esperienza) in grado di fare una cosa del genere (considerando un'implementazione ULTRA MINIMALE) si possono contare sulle dita della mano di un monco ;-)

    Jersey non e' nato ieri: ci ha lavorato un team di espertoni dal 2013! Sono 10 anni di lavoro!

  • Re: JAX-RS: di cosa si occupa esattamente l'implementazione Jersey?

    Più chiaro di così non potevi essere :).

    Grazie mille per l’aiuto

Devi accedere o registrarti per scrivere nel forum
4 risposte