2016-05-12 2 views
3

Я использую Grizzly для обслуживания моего сервиса REST, который может иметь несколько «модулей». Я хотел бы иметь возможность использовать один и тот же базовый URL для службы и для статического контента, так что я могу получить доступ ко всем этим адресам:Как обслуживать статический контент и ресурсы на одном базовом URL-адресе с Grizzly

Код, который я пытаюсь установить thi S с выглядит следующим образом:

private HttpServer createServer(String host, int port, ResourceConfig config) 
{    
    HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://" + host + ":" + port + "/"), config, false); 

    HttpHandler httpHandler = new CLStaticHttpHandler(HttpServer.class.getClassLoader(), "docs/"); 
    server.getServerConfiguration().addHttpHandler(httpHandler, "/"); 

    return server; 
} 

С помощью этого кода, я только в состоянии увидеть HTML-страницы, и я получаю «ресурса, идентифицированного пути не существует» ответ, когда я пытаюсь получить свои ресурсы. Когда я комментирую код, чтобы добавить HttpHandler, то я могу получить доступ к своим ресурсам (но у них нет документов, конечно). Что мне нужно сделать для доступа к моим ресурсам и моему статическому контенту?

ответ

2

я закончил написание службы для обработки статических ресурсов себя. Я решил обслуживать свои файлы из файловой системы, но этот подход также будет работать для обслуживания их из банки - вам просто нужно будет получить файл в качестве ресурса, а не напрямую создавать файл.

@Path("/") 
public class StaticService 
{ 

    @GET 
    @Path("/{docPath:.*}.{ext}") 
    public Response getHtml(@PathParam("docPath") String docPath, @PathParam("ext") String ext, @HeaderParam("accept") String accept) 
    { 
     File file = new File(cleanDocPath(docPath) + "." + ext); 
     return Response.ok(file).build(); 
    } 

    @GET 
    @Path("{docPath:.*}") 
    public Response getFolder(@PathParam("docPath") String docPath) 
    { 
     File file = null; 
     if ("".equals(docPath) || "/".equals(docPath)) 
     { 
      file = new File("index.html"); 
     } 
     else 
     { 
      file = new File(cleanDocPath(docPath) + "/index.html"); 
     } 
     return Response.ok(file).build(); 
    } 

    private String cleanDocPath(String docPath) 
    { 
     if (docPath.startsWith("/")) 
     { 
      return docPath.substring(1); 
     } 
     else 
     { 
      return docPath; 
     } 
    } 
} 
2

Одна вещь, которую вы можете сделать, это запустить гризли в качестве контейнера сервлетов. Таким образом, вы можете использовать run Jersey as servlet filter и add a default servlet для обработки статического содержимого. Например

public class Main { 
    public static HttpServer createServer() { 
     WebappContext context = new WebappContext("GrizzlyContext", ""); 
     createJerseyFilter(context); 
     createDefaultServlet(context); 
     HttpServer server = GrizzlyHttpServerFactory 
       .createHttpServer(URI.create("http://localhost:8080/")); 
     context.deploy(server); 
     return server; 
    } 

    private static void createJerseyFilter(WebappContext context) { 
     ResourceConfig rc = new ResourceConfig().packages("com.grizzly.test"); 
     // This causes Jersey to forward 404s to default servlet 
     // which will catch all the static content requests. 
     rc.property(ServletProperties.FILTER_FORWARD_ON_404, true); 
     FilterRegistration reg = context.addFilter("JerseyApp", new ServletContainer(rc)); 
     reg.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), "/*"); 
    } 

    private static void createDefaultServlet(WebappContext context) { 
     ArraySet<File> baseDir = new ArraySet<>(File.class); 
     baseDir.add(new File(".")); 
     ServletRegistration defaultServletReg 
       = context.addServlet("DefaultServlet", new DefaultServlet(baseDir) {}); 
     defaultServletReg.addMapping("/*"); 
    } 

    public static void main(String[] args) throws IOException { 
     HttpServer server = createServer();  
     System.in.read(); 
     server.stop(); 
    } 
} 

Вам нужно будет добавить сервлет DEPENDENCY Джерси Grizzly

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-grizzly2-servlet</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

Единственная проблема такого подхода заключается в том, что сервлет по умолчанию предназначен для обслуживания файлов из файловой системы, а не от classpath, как вы сейчас пытаетесь сделать. Вы можете увидеть в методе createDefaultServlet. Я просто установил базовый каталог в текущий рабочий каталог. Так вот где все ваши файлы должны быть. Вы можете изменить его на "docs", чтобы все ваши файлы находились в папке docs, которая будет находиться в текущем рабочем каталоге.

Если вы хотите читать файлы из пути к классам, вам может потребоваться реализовать собственный сервлет. Вы можете посмотреть на source code for DefaultServlet и попытаться изменить его для обслуживания из пути к классам. Вы также можете проверить Dropwizard's AssetServlet, который уже обслуживает контент из пути к классам.

Или вы можете просто сказать, забыть его, и наливают из файловой системы :-)

+0

Я действительно не пробовал это, так как в итоге я придумал другую работу. Если у меня возникнут проблемы с этим, я попробую. Спасибо за ответ! – Amber

 Смежные вопросы

  • Нет связанных вопросов^_^