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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top