Come distribuire un’applicazione JAX-RS?

La specifica JAX-RS 1.1 dice a pagina 6:

Se non è presente alcuna sottoclass Application, il servlet aggiunto DEVE essere nominato:

javax.ws.rs.core.Application 

Qual è il servlet aggiunto? Potrebbe essere un servlet arbitrario?

Se è presente una sottoclass dell’applicazione e esiste già un servlet definito con un parametro di inizializzazione del servlet denominato:

 javax.ws.rs.Application 

Di nuovo, che cosa è “un servlet” qui?

Se è presente una sottoclass Application che non viene gestita da un servlet esistente, il servlet aggiunto da ContainerInitializer DEVE essere nominato con il nome completo della sottoclass Application.

“Il servlet aggiunto da ContainerInitializer” significa che i servlet vengono aggiunti automaticamente? Come sarebbe una configurazione?

Al momento non utilizzo né una class Application né un web.xml e funziona (con GlassFish 3.1). Questo meccanismo di distribuzione richiede una scansione completa del percorso di class, che potrebbe essere lenta con le librerie di grandi dimensioni?

Come distribuire su un contenitore Servlet?

C’è un numero confuso di opzioni di configurazione nel web. Vedi questo esempio con i parametri di contesto nel web.xml (non funziona per me!). Qual è il modo preferito per distribuire un’applicazione JAX-RS?

Esistono numerose opzioni per la distribuzione in un contenitore Java EE 6 (più specificamente un’implementazione di Servlet 3.0):

Il più semplice è:

    javax.ws.rs.core.Application 1   javax.ws.rs.core.Application /rest/*   

Quindi tutte le classi @Path e @Provider trovate nella tua applicazione web saranno disponibili nell’applicazione JAX-RS “predefinita” con un pattern URL servlet di "/rest/*" .

Se hai una o più classi che estendono javax.ws.rs.core.Application , puoi specificare in questo modo:

    com.example.jaxrs.MyApplication 1   com.example.jaxrs.MyApplication /rest/*   

Si consiglia di fare quanto sopra nel caso in cui si desidera restituire solo insiemi specifici di classi @Path / @Provider su un URL (in modo da poter avere una seconda MyApplication2 con un pattern URL diverso sopra).

Puoi anche saltare l’intero file web.xml e annotare semplicemente la tua class MyApplication @ApplicationPath che fungerà da modello URL. Raccomanderei comunque di mantenere il web.xml perché probabilmente dovresti aggiungere altre informazioni sull’applicazione web in ogni caso.

Se ti stai chiedendo da dove viene la servlet-class della servlet-class , questa viene automaticamente aggiunta dall’ambiente. Puoi avere un’idea guardando ServletContext Servlet 3.0.

Con WAS 8.5, ho modificato il web.xml per aggiungere:

  com.ibm.websphere.jaxrs.server.IBMRestServlet  javax.ws.rs.Application com.tada.rest.RestApplication  1 javax.ws.rs.core.Application   javax.ws.rs.core.Application /rest/*  

Il mio RestApplication assomiglia a:

 import java.util.HashSet; import java.util.Set; import javax.ws.rs.core.Application; public class RestApplication extends Application { @Override public Set> getClasses() { Set> sets = new HashSet>(); sets.add(RestService.class); return sets; } } 

Il mio RestService sembra

 @Path("/tada") public class RestService { @GET public String getSomething() { return "tada"; } } 

E aggiungo nel pom.xml la dipendenza:

  javax.ws.rs javax.ws.rs-api 2.0  

Con Servlet 3.0, segui questo. Questo funziona per me.

  JAX-RS Tools Generated - Do not modify JAX-RS Servlet com.ibm.websphere.jaxrs.server.IBMRestServlet  javax.ws.rs.Application your.restsrv.config.RESTConfig  1 true false   javax.ws.rs.core.Application 1   javax.ws.rs.core.Application /rest/*   JAX-RS Servlet /*  

Come ho detto nel commento sopra, tutto dipende dal framework che si desidera utilizzare.

http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html per Jersey http://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60 .html per RESTeasy

Per quanto ne so, JAX-RS non contiene una specifica per la distribuzione.