web-dev-qa-db-fra.com

Comment déployer une application JAX-RS?

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? 

31
deamon

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.

60
Bryant Luk

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>
1
Matthieu Lambert

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>
0
PrasadO