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

17

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

现在,我需要提供静态内容,并想知道如何在JAX-RS中实现。请注意,我不知道编译时的物理目录结构。因此,给定一个URL,例如:

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

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

是否可以只用纯JAX-RS来完成?

谢谢。

编辑

在编译时已知:

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

在编译时未知:

  • 根文件夹实际内容 - 有多少文件、文件类型、目录结构等情况。
3个回答

22

刚刚找到了。

根据 javax.ws.rs.Path 注释的 Java 文档,可以指定一个正则表达式来表示模板参数匹配的内容。

因此,以下代码可以正常工作:

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

GET http://localhost:8182/static/yaba/daba/doo.png 请求达到了 Get 方法,并且 path 等于 "yaba/daba/doo.png" - 正是我要寻找的。

希望能对任何人有所帮助。

顺便说一句,FileRepresentation 属于 Restlet,因此一个真正纯粹的 JAX-RS 实现将在这里返回其他内容。


6
假设您的项目中静态文件夹位于此处:./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

我已经在目标链接中回答得很好了。你有没有看过它?你的-1有什么意义?我的答案是这个帖子中最好的! - Maksim Kostromin
了解,抱歉。 - Maksim Kostromin

1

你可以通过实现相应的资源,使用纯JAX-RS来完成它:基本上你只需要发送一个字节数组,而JAX-RS已经包含了任何媒体类型的字节数组提供程序。

你的实现可能比Web服务器的标准实现效率低。通常最好将静态内容放在像Apache HTTPD、IIS或甚至Tomcat这样的Web服务器上。


我有一个限制,可能没有可用的Apache或IIS。 - mark
我的问题不在于发送数据,而是使用JAX-RS规范匹配静态资源。 - mark
你能详细说明在编译时已知的内容,哪些可以稍后配置,以及什么是动态的吗?静态内容通常意味着某些静态而非动态的东西... - Tarlog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接