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

2022-09-03 00:48:20

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

现在我必须提供静态内容,我想知道如何使用JAX-RS做到这一点。请注意,我在编译时不知道物理目录结构。因此,给定一个像这样的URL

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

必须返回该文件,其中是静态内容根目录。$(ROOT)/yaba/daba/doo.png$(ROOT)

有没有可能用纯 JAX-RS 做到这一点?

谢谢。

编辑

在编译时已知:

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

编译时未知:

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

答案 1

刚刚找到它。

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

因此,以下代码有效:

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

GET http://localhost:8182/static/yaba/daba/doo.png达到等于“yaba/daba/doo.png”的方法 - 正是我正在寻找的。Getpath

希望它能帮助任何人。

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


答案 2

假设静态文件夹位于以下位置:在您的项目中:./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();
  }
}

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