2010-01-15 10 views
29

El JAX-RS 1.1 especificación dice en la página 6:¿Cómo implementar una aplicación JAX-RS?

Si ninguna subclase de aplicación está presente el servlet añadido debe ser nombrado:

javax.ws.rs.core.Application 

¿Cuál es el servlet añadido? ¿Podría ser un servlet arbitrario?

Si una subclase de aplicación está presente y ya hay un servlet definido que tiene un parámetro de inicialización servlet llamado:

javax.ws.rs.Application 

Una vez más, lo que es "un servlet" aquí?

Si una subclase de aplicación está presente que no está siendo manejado por un servlet existente, entonces el servlet añadido por el ContainerInitializer DEBE ser nombrado con el nombre completo de la subclase de aplicación.

¿El "servlet agregado por el ContainerInitializer" significa que los servlets se agregan automáticamente? ¿Cómo se vería una configuración?

Por el momento no utilizo una clase de aplicación ni un web.xml y funciona (con GlassFish 3.1). ¿Este mecanismo de implementación requiere un escaneo de ruta de clase completa, que podría ser lento con grandes bibliotecas?

¿Cómo implementar en un contenedor Servlet?

Hay un número confuso de opciones de configuración en la web. ¡Vea esto example with context params in the web.xml (no funciona para mí!). ¿Cuál es la forma preferida de implementar una aplicación JAX-RS?

+0

Seguramente esto dependerá de la implementación que esté utilizando? Resteasy, Jersey,? –

+7

¿No debería el despliegue ser independiente de una implementación? Quiero poder implementar una aplicación JAX-RS en un servidor arbitrario de Java EE 6 sin modificaciones, como implementaría una aplicación de servlet. – deamon

+0

¿Y qué es el ContainerInitializer, de todos modos? La especificación ni siquiera lo menciona hasta la página 6, y nunca más. – Amalgovinus

Respuesta

57

Hay una serie de opciones para el despliegue en un 6 contenedor Java EE (más específicamente una implementación servlet 3.0):

La más sencilla es:

<?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> 

Entonces todos los @Path y @Provider clases encontradas en su aplicación web estará disponible en la aplicación JAX-RS "predeterminada" con un patrón de URL servlet de "/rest/*".

Si usted tiene una o más clases que se extiende javax.ws.rs.core.Application, puede especificar este modo:

<?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> 

es posible que desee hacer lo anterior, en caso de que desee para volver conjuntos específicos de @Path/@Provider clases de una URL (para que pueda tener una segunda MyApplication2 con un patrón de URL diferente arriba).

También puede omitir el total de web.xml y simplemente anotar su clase MyApplication con @ApplicationPath que servirá como patrón de URL. Yo recomendaría mantener el web.xml en cualquier caso, porque de todos modos tendrá que agregar otra información sobre la aplicación web.

Si se pregunta de dónde viene el servlet-class, el entorno lo agrega automáticamente. Puede hacerse una idea mirando el Servlet 3.0 ServletContext.

+0

Agradable desglose, gracias. – jgitter

+0

Recibía mensajes en eclipse 'Error 404: javax.servlet.UnavailableException: SRVE0200E: Servlet [com.ibm.websphere.jaxrs.server.IBMRestServlet]: No se pudo encontrar la clase requerida - com.ibm.websphere.jaxrs.server. IBMRestServlet' Quitando la clase de servlet de web.xml como esta respuesta lo solucionó !. Gracias – nacho4d

+0

¿Cómo puede su web.xml ser tan mínimo sin una propiedad "resteasy.scan" establecida en "verdadero", para que automáticamente encuentre los recursos relevantes? ¿Aún no tendrías que enumerar todos tus recursos en web.xml? – Amalgovinus

-3

Como dije en el comentario anterior, todo depende del marco que desee utilizar.

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

Por lo que yo sé, JAX-RS no contiene una especificación para la implementación.

+4

Eso NO ES CORRECTO. JAX-RS especifica cómo se va a publicar una aplicación JAX-RS en un contenedor Servlet de forma portátil en las Aplicaciones/Publicación/Servlet del Capítulo. Además, permite implementaciones para proporcionar otras instalaciones para implementar. –

1

Con Servlet3.0, siga esto. Esto funciona para mí

<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> 
+2

Me aparece 'Broken Link: com.ibm.websphere.jaxrs.server.IBMRestServlet' No puedo encontrar' jar' que contenga esta clase, donde puedo encontrar este 'jar' – Vishrant

0

Con fue de 8,5, cambio el web.xml para agregar:

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

Mi aspecto RestApplication como:

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; 
    } 
} 

Mi RestService parece

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

Y agrego en el pom.xml la dependencia:

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>javax.ws.rs-api</artifactId> 
    <version>2.0</version> 
</dependency> 
Cuestiones relacionadas