Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to serve static content with JAX-RS?

I have a self hosted JAX-RS REST service implemented with the JAX-RS Restlet extension.

Now I have to serve static content and I was wondering how to do it with JAX-RS. Note, that I do not know the physical directory structure at compile-time. So, given a URL like

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

the file $(ROOT)/yaba/daba/doo.png has to be returned, where $(ROOT) is the static content root directory.

Is it possible to do it with pure JAX-RS?

Thanks.

EDIT

Known at compile-time:

  • File system path of the static content root folder
  • HTTP URL used to reference the static content root folder

Unknown at compile-time:

  • The actual content of the root folder - how many files, file types, directory structure.
like image 537
mark Avatar asked Dec 27 '11 09:12

mark


2 Answers

Just found it.

According to the javax.ws.rs.Path annotation javadocs one can specify a regex to indicate what is considered to be the template parameter match.

Hence, the following code works:

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

GET http://localhost:8182/static/yaba/daba/doo.png reaches the Get method with path equal to "yaba/daba/doo.png" - just what I was looking for.

Hope it helps anyone.

BTW, FileRepresentation belongs to Restlet, so a really pure JAX-RS implementation would return something else here.

like image 187
mark Avatar answered Nov 16 '22 02:11

mark


Assuming that static folder is located here: ./src/main/resources/WEB-INF/static in your project:

@Path("")
public class StaticResourcesResource {

  @Inject ServletContext context;

  @GET
  @Path("{path: ^static\\/.*}")
  public Response staticResources(@PathParam("path") final String path) {

    InputStream resource = context.getResourceAsStream(String.format("/WEB-INF/%s", path));

    return Objects.isNull(resource)
        ? Response.status(NOT_FOUND).build()
        : Response.ok().entity(resource).build();
  }
}

Here is full description with how-to example and repository: https://daggerok.github.io/thymeleaf-ee/#configure-jax-rs-serve-static-files-and-webjars

like image 6
Maksim Kostromin Avatar answered Nov 16 '22 01:11

Maksim Kostromin