La spécification JAX-RS 1.1 indique à la page 6:
Si aucune sous-classe d'application n'est présente la servlet ajoutée DOIT être nommée:
javax.ws.rs.core.Application
Quelle est la servlet ajoutée? Serait-ce une servlet arbitraire?
Si une sous-classe d’application est présente et il y a déjà un servlet défini qui a une initialisation de servlet paramètre nommé:
javax.ws.rs.Application
Encore une fois, qu'est-ce que "un servlet" ici?
Si une sous-classe d’application est présente cela n'est pas traité par un servlet existant puis le servlet ajouté par le ContainerInitializer DOIT être nommé avec le nom complet de la sous-classe Application.
"Le servlet ajouté par ContainerInitializer" signifie-t-il que les servlets sont ajoutés automatiquement? A quoi ressemblerait une configuration?
Pour le moment, je n’utilise ni classe d’application ni web.xml et cela fonctionne (avec GlassFish 3.1). Ce mécanisme de déploiement nécessite-t-il une analyse complète du chemin d'accès aux classes, qui pourrait être lente avec les grandes bibliothèques?
Comment déployer sur un conteneur Servlet?
Il existe un grand nombre d’options de configuration déroutantes sur le Web. Voir cet exemple avec les paramètres de contexte dans le web.xml (ça ne marche pas pour moi!). Quel est le moyen préféré de déployer une application JAX-RS?
Il existe un certain nombre d'options pour le déploiement dans un conteneur Java EE 6 (plus spécifiquement une implémentation de Servlet 3.0):
Le plus simple est:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Ensuite, toutes les classes @Path
et @Provider
trouvées dans votre application Web seront disponibles dans l'application JAX-RS "par défaut" avec un modèle d'URL de servlet de "/rest/*"
.
Si vous avez une ou plusieurs classes qui étendent javax.ws.rs.core.Application
, vous pouvez spécifier comme suit:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Vous souhaiterez peut-être effectuer les opérations ci-dessus si vous souhaitez uniquement renvoyer des ensembles spécifiques de classes @Path
/@Provider
sur une URL (afin que vous puissiez avoir une deuxième application MyApplication2 avec un modèle d'URL différent ci-dessus).
Vous pouvez également ignorer le web.xml
tout entier et simplement annoter votre classe MyApplication
avec @ApplicationPath
qui servira de modèle d'URL. Dans tous les cas, je vous recommande de conserver le web.xml
car vous devrez probablement y ajouter d’autres informations sur l’application Web.
Si vous vous demandez d'où provient le servlet-class
, il est automatiquement ajouté par l'environnement. Vous pouvez vous faire une idée en consultant Servlet 3.0 ServletContext
.
Avec WAS 8.5, je modifie le fichier web.xml pour ajouter:
<servlet>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.tada.rest.RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Mon RestApplication ressemble à:
import Java.util.HashSet;
import Java.util.Set;
import javax.ws.rs.core.Application;
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> sets = new HashSet<Class<?>>();
sets.add(RestService.class);
return sets;
}
}
Mon RestService ressemble à
@Path("/tada")
public class RestService {
@GET
public String getSomething() {
return "tada";
}
}
Et j'ajoute dans le pom.xml la dépendance:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
Avec Servlet3.0, suivez ceci. Cela fonctionne pour moi.
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>your.restsrv.config.RESTConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<enabled>true</enabled>
<async-supported>false</async-supported>
</servlet>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>