【问题标题】:How to serve static content with JAX-RS?如何使用 JAX-RS 提供静态内容?
【发布时间】:2012-01-28 09:35:00
【问题描述】:

我有一个使用 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

编译时未知:

  • 根文件夹的实际内容——文件数量、文件类型、目录结构。

【问题讨论】:

    标签: java rest jax-rs restlet


    【解决方案1】:

    刚刚找到。

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

    因此,以下代码有效:

    @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 实现会在此处返回其他内容。

    【讨论】:

      【解决方案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

      【讨论】:

      • 我已经在目标链接中做了很好的回答。你检查过吗?你的-1是什么意思?我的回答是人们可以在此线程中找到的最佳答案!
      • 理解,我很抱歉
      【解决方案3】:

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

      您的实现可能不如 Web 服务器的标准实现高效。通常最好的方法是将静态内容放在 Apache HTTPD 或 IIS 甚至 Tomcat 等 Web 服务器上。

      【讨论】:

      • 我有一个限制,可能既没有 apache 也没有 IIS 可用。
      • 我的问题不是发送数据,而是使用 JAX-RS 规范匹配静态资源。
      • 你能详细说明一下编译时究竟知道什么,以后可以配置什么,什么是动态的。静态内容通常意味着静态而不是动态...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2018-12-25
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多