JAX-RS 1.0

Wednesday, November 12, 2008

Una delle feature più interessanti che saranno presenti in Java EE 6 è rappresentata dalle nuove API dedicate alla semplificazione della scrittura del codice per implementare Web service di tipo REST, ossia le API JAX-RS: The Java API for RESTful Web Services (JSR 311) delle quali è già disponibile una implementazione nella versione finale (Jersey 1.0) e quindi pronte per essere provate ed utilizzate.
Se scarichiamo il neonato Glassfish v3 prelude avremo a disposizione il runtime di nostro interesse più altre succulente novità (anche se ancora work in progress) come JSF 2.0.
Ma torniamo a noi: JAX-RS 1.0 permette di scrivere agevolmente dei servizi REST a partire (anche) da dei semplici POJO, utilizzando, manco a dirlo, il meccanismo delle annotation, come in JAX-WS 2.x, il framework standard di Java per i Web service basati su WSDL.
Prima di JAX-RS 1.0, personalmente, per realizzare dei servizi REST scrivevo delle "semplici" Servlet implementando i vari metodi doXxx() che corrispondevano ai diversi metodi HTTP e in esse implementavo la mia logica applicativa. Inoltre, quando ho avuto la necessità di far si che in risposta si avessero dei dati rappresentati in formato JSON mi appoggiavo a qualche libreria di terze parti che, senza grandissime difficoltà, mi permettevano, con qualche passaggio in più però, di raggiungere i risultati voluti. Con le nuove API il tutto è *notevolmente* più semplice. Senza dilungarmi troppo, ecco un piccolo esempio estremamente semplice: supponiamo di aver bisogno di un servizio REST, che, mediante una HTTP GET mi restituisca alcune info sul servizio stesso, rappresentando questa risposta mediante JSON.
Le informazioni sul servizio le rappresento mediante questa classe così definita:

@XmlRootElement
public class SysInfo {

private String version;
private boolean busy;
private String javaVersion;

public boolean isBusy() {
return busy;
}

public void setBusy(boolean busy) {
this.busy = busy;
}

public String getJavaVersion() {
return javaVersion;
}

public void setJavaVersion(String javaVersion) {
this.javaVersion = javaVersion;
}

public String getVersion() {
return version;
}

public void setVersion(String version) {
this.version = version;
}

}


Da notare subito l'annotation @XmlRootElement di JAXB 2.x. Questa è necessaria perchè è grazie a JAXB che l' applicazione sarà in grado di rappresentare una istanza della classe precedente mediante JSON.

Il servizio REST è invece rappresentato dalla classe seguente:

@Path("info")
public class SysInfoResource {
@Context
private UriInfo context;

private SysInfo info = new SysInfo();

/** Creates a new instance of SysInfoResource */
public SysInfoResource() {

info.setBusy(false);
info.setVersion("1.0");
info.setJavaVersion(System.getProperty("java.version"));
}

/**
* Retrieves representation of an instance of px.rest.SysInfoResource
* @return an instance of SysInfo
*/
@GET
@Produces("application/json")
public SysInfo getInfo() {

return info;

}

}


Dobbiamo notare:

l'annotazione @Path(...) che ci permette di indicare a quale path è raggiungibile la risorsa REST
l'annotazione @GET che indica che il metodo annotato potrà essere invocato mediante una HTTP GET; naturalmente JAX-RS mette a disposizione le annotation
per ciascun metodo HTTP.
l'annotazione @Produces(...) che indica il MIME Type dei dati restituiti dal metodo annotato, in questo caso in formato JSON.

Informalmente parlando stiamo quindi annotando il nostro metodo dicendo: esso sarà raggiungibile mediante una HTTP GET e produrrà una rappresentazione JSON di una istanza della classe SysInfo.

Una volta fatto il deploy, possiamo provare il funzionamento del servizio con una GET via browser all'URL:

http://localhost:8080/mycontext/resources/info

ed ottenere, per esempio, la seguente rappresentazione JSON:

{"busy":"false","javaVersion":"1.6.0_10","version":"1.0"}

You Might Also Like

2 commenti

Subscribe