2011-12-27 9 views
10

Tengo un servicio JAX-RS REST autoguiado implementado con la extensión JAX-RS Restlet.¿Cómo se sirve contenido estático con JAX-RS?

Ahora tengo que servir contenido estático y me preguntaba cómo hacerlo con JAX-RS. Tenga en cuenta que no conozco la estructura física del directorio en tiempo de compilación. Así, dada una URL como

http://bla-bla:8182/static/yaba/daba/doo.png 

el archivo $(ROOT)/yaba/daba/doo.png tiene que ser devuelto, donde $(ROOT) es el directorio raíz de contenido estático.

¿Es posible hacerlo con JAX-RS puro?

Gracias.

EDITAR

Conocido en tiempo de compilación:

  • ruta del sistema de archivos de la carpeta raíz de contenido estático
  • URL HTTP utilizado para hacer referencia a la carpeta raíz de contenido estático

Desconocido en tiempo de compilación:

  • El contenido real de la carpeta raíz: cuántos archivos, tipos de archivos y estructura de directorios.

Respuesta

16

Acaba de encontrarlo.

De acuerdo con la anotación javadocs javax.ws.rs.Path, se puede especificar una expresión regular para indicar lo que se considera la coincidencia del parámetro de la plantilla.

Por lo tanto, el siguiente código funciona:

@Path("static") 
public class StaticContentHandler { 
    ... 
    @GET 
    @Path("{path:.*}") 
    public FileRepresentation Get(@PathParam("path") String path) { 
    ...; 
    } 
} 

GET http://localhost:8182/static/yaba/daba/doo.png alcanza el método Get con path igual a "yaba/Daba/doo.png" - justo lo que estaba buscando.

Espero que ayude a cualquiera.

BTW, FileRepresentation pertenece a Restlet, por lo que una implementación JAX-RS realmente pura devolvería algo más aquí.

0

Puede hacerlo con JAX-RS pura implementando los recursos correspondientes: básicamente solo necesita enviar una matriz de bytes y JAX-RS ya incluye el proveedor de arreglos de bytes para cualquier tipo de medio.

El problema es que su implementación probablemente será menos eficiente que las implementaciones estándar de los servidores web. Por lo general, lo mejor es colocar el contenido estático en un servidor web como Apache HTTPD o IIS o incluso Tomcat.

+0

Tengo una limitación, que podría no haber apache ni IIS disponibles. – mark

+0

Mi problema no es enviar los datos, sino hacer coincidir los recursos estáticos con la especificación JAX-RS. – mark

+0

¿Puede explicar qué se conoce exactamente en tiempo de compilación, qué se puede configurar más adelante y qué es dinámico? El contenido estático por lo general significa algo estático y no dinámico ... – Tarlog

Cuestiones relacionadas