Comment déployer une application JAX-RS?
-
20-09-2019 - |
Question
La spécification JAX-RS 1.1 dit à la page 6:
Si aucune sous-classe d'application est présente le servlet ajouté DOIT être nommé:
javax.ws.rs.core.Application
Quelle est la servlet ajoutée? Se pourrait-il être un 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 du servlet paramètre nommé:
javax.ws.rs.Application
Encore une fois, ce qui est "un servlet" ici?
Si une sous-classe d'application est présente qui est non traitée par un servlet existant le servlet ajoutée par l'MUST ContainerInitializer être nommé avec le nom complet de la sous-classe d'application.
Est-ce que « le servlet ajouté par le ContainerInitializer » signifie que les servlets est ajouté automatiquement? Comment une configuration ressembler?
En ce moment je n'utilise une classe d'application ni web.xml et cela fonctionne (avec GlassFish 3.1). Est-ce que ce mécanisme de déploiement nécessite une analyse de chemin de classe complète, ce qui pourrait être lent avec de grandes bibliothèques?
Comment déployer sur un conteneur de servlets?
Il y a un certain nombre déroutant d'options de configuration autour du Web. Voir cette avec contexte params dans la web.xml (ne fonctionne pas pour moi!). Quelle est la meilleure façon de déployer une application JAX-RS?
La solution
Il y a un certain nombre d'options pour le déploiement dans un conteneur Java EE 6 (plus spécifiquement une implémentation 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>
Alors toutes les classes et @Path
@Provider
trouvées dans votre application web sera disponible dans le "défaut" l'application JAX-RS avec un modèle d'URL de servlet de "/rest/*"
.
Si vous avez une ou plusieurs classes qui s'étend javax.ws.rs.core.Application
, vous pouvez spécifier comme ceci:
<?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 pouvez faire ce qui précède dans le cas où vous souhaitez retourner uniquement des ensembles spécifiques de classes @Path
/ @Provider
sur une URL (vous pouvez donc avoir une seconde MyApplication2 avec un motif autre URL ci-dessus).
Vous pouvez aussi sauter l'ensemble web.xml
tout à fait juste et annoter votre classe MyApplication
wih @ApplicationPath
qui servira de modèle d'URL. Je recommande le maintien web.xml
dans tous les cas parce que vous aurez probablement à ajouter d'autres informations sur l'application Web de toute façon.
Si vous vous demandez où le servlet-class
vient, il est automatiquement ajouté dans par l'environnement. Vous pouvez avoir une idée en regardant le Servlet 3.0 ServletContext
.
Autres conseils
était de 8,5, je change le web.xml d'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 look RestApplication comme:
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 ce. 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>
Comme je l'ai dit dans le commentaire ci-dessus, tout dépend du cadre que vous souhaitez utiliser.
http://syrupsucker.blogspot.com /2008/10/deploying-jersey-in-tomcat-60.html pour Jersey http://syrupsucker.blogspot.com/2008/ 10 / déployant-resteasy-in-tomcat-60.html pour rESTeasy
Pour autant que je sache, JAX-RS ne contient pas une spécification pour le déploiement.