Как обслуживать статический контент с JAX-RS? - PullRequest
14 голосов
/ 27 декабря 2011

У меня есть собственная служба 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?

Спасибо.

EDIT

Известен во время компиляции:

  • Путь к файловой системе корневой папки статического содержимого
  • HTTP URL, используемый для ссылки на корневую папку статического содержимого

Неизвестно во время компиляции:

  • Фактическое содержимое корневой папки - сколько файлов, типы файлов, структура каталогов.

Ответы [ 3 ]

19 голосов
/ 27 декабря 2011

Только что нашел.

Согласно 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 достигает метода Get с path, равным "yaba / daba / doo.png" - именно то, что я искал.

Надеюсь, это кому-нибудь поможет.

Кстати, FileRepresentation принадлежит Restlet, поэтому действительно чистая реализация JAX-RS вернула бы здесь что-то еще.

1 голос
/ 28 июня 2018

Предполагается, что статическая папка находится здесь: ./src/main/resources/WEB-INF/static в вашем проекте:

@Path("")
@Stateless
public class StaticResourcesResource {

  @Inject ServletContext context;

  @GET
  @Path("{path: ^static\\/.*}")
  public Response staticResources(@PathParam("path") final String path) {

    final InputStream resource = context.getResourceAsStream(String.format("/WEB-INF/%s", path));

    return null == 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 голос
/ 27 декабря 2011

Вы можете сделать это с помощью чистого JAX-RS, реализовав соответствующие ресурсы: в основном вам просто нужно отправить байтовый массив, а JAX-RS уже включает в себя провайдер Byte Array для любого типа носителя.

Проблема в том, что ваша реализация, вероятно, будет менее эффективной, чем стандартные реализации веб-серверов. Обычно лучше всего разместить статический контент на веб-сервере, таком как Apache HTTPD, IIS или даже Tomcat.

...