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:
Unknown at compile-time:
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With