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