如何使用JAX-RS提供静态内容?

mar*_*ark 15 java rest jax-rs restlet

我有一个使用JAX-RS Restlet扩展实现的自托管JAX-RS REST服务.

现在我必须提供静态内容,我想知道如何使用JAX-RS.注意,我不知道编译时的物理目录结构.所以,给出一个像这样的URL

http://bla-bla:8182/static/yaba/daba/doo.png
Run Code Online (Sandbox Code Playgroud)

$(ROOT)/yaba/daba/doo.png必须返回该文件,$(ROOT)静态内容根目录在哪里.

是否可以使用纯JAX-RS进行操作?

谢谢.

编辑

在编译时已知:

  • 静态内容根文件夹的文件系统路径
  • 用于引用静态内容根文件夹的HTTP URL

编译时未知:

  • 根文件夹的实际内容 - 有多少文件,文件类型,目录结构.

mar*_*ark 20

刚发现它.

根据javax.ws.rs.Path注释javadocs,可以指定正则表达式来指示什么被认为是模板参数匹配.

因此,以下代码有效:

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

GET http://localhost:8182/static/yaba/daba/doo.png到达Get与方法path等于"雅巴/达巴/ doo.png" -正是我一直在寻找.

希望它能帮助任何人.

顺便说一句,FileRepresentation属于Restlet,所以真正纯粹的JAX-RS实现会返回其他东西.


Mak*_*min 5

假设静态文件夹位于此处:./src/main/resources/WEB-INF/static在您的项目中:

@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();
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是操作示例和存储库的完整说明:https : //daggerok.github.io/thymeleaf-ee/#configure-jax-rs-serve-static-files-and-webjars