2013-08-21 34 views
5

Próbuję wdrożyć interfejs REST API oparty na sieci Spring-East przy użyciu Grizzly's com.sun.grizzly.http.embed.GrizzlyWebServer. Chcę również używać statycznych treści przy użyciu tego samego. Oto co mam:GrizzlyWebServer + Spring + Jersey + wyświetlaj statyczną treść z poziomu JAR

String host = "localhost"; 
int port = 8081; 

// For jersey + Spring 
ServletAdapter jAdapter = new ServletAdapter("jersey"); 
jAdapter.setContextPath("/api");   
jAdapter.setServletInstance(new SpringServlet()); 
jAdapter.addContextParameter("contextConfigLocation", "classpath:spring-context.xml"); 
jAdapter.addServletListener("org.springframework.web.context.ContextLoaderListener"); 
jAdapter.addServletListener("org.springframework.web.context.request.RequestContextListener");    

// create GrizzlyWebServer 
GrizzlyWebServer grizzlyServer = new GrizzlyWebServer(host, port, "webapp", false); 

// add jersey adapter 
grizzlyServer.addGrizzlyAdapter(jAdapter, new String[]{"/api"}); 

// start server 
grizzlyServer.start(); 

System.out.println("Start running server(host: " + host + ",port: " + Integer.toString(port)); 
System.out.println("Press any key to stop the server."); 

// hang on 
System.in.read(); 

// stop 
grizzlyServer.stop(); 

The Jersey „Adapter” działa dobrze, ale nie jestem w stanie uzyskać statyczny obecny w folderze „webapp” aby Mu służono (Błąd 404).

Mój projekt struktura folderów jest następująca:

GrizzlyTest 
    -- src 
    | | 
    | -- main 
    |  | 
    |  -- java 
    |  -- resources 
    |  | 
    |  -- webapp 
    |  | | 
    |  | -- index.html 
    |  -- spring-context.xml 
    | 
    -- pom.xml 

Am I pomyłki w dostarczaniu ścieżkę „webapp” w linii new GrizzlyWebServer(host, port, "webapp", false); ??

Czy istnieje inny sposób wyświetlania zawartości statycznej?

Odpowiedz

7

Oto przykład, jak służyć zasobom Jersey-Spring i statycznej zawartości z folderu oraz z pliku jar działającego na Grizzly2.

https://github.com/oleksiys/samples/tree/master/jersey1-grizzly2-spring

Kod serwer wygląda następująco:

// Initialize Grizzly HttpServer 
HttpServer server = new HttpServer(); 
NetworkListener listener = new NetworkListener("grizzly2", "localhost", 3388); 
server.addListener(listener); 

// Initialize and add Spring-aware Jersey resource 
WebappContext ctx = new WebappContext("ctx", "/api"); 
final ServletRegistration reg = ctx.addServlet("spring", new SpringServlet()); 
reg.addMapping("/*"); 
ctx.addContextInitParameter("contextConfigLocation", "classpath:spring-context.xml"); 
ctx.addListener("org.springframework.web.context.ContextLoaderListener"); 
ctx.addListener("org.springframework.web.context.request.RequestContextListener"); 
ctx.deploy(server); 

// Add the StaticHttpHandler to serve static resources from the static1 folder 
server.getServerConfiguration().addHttpHandler(
     new StaticHttpHandler("src/main/resources/webapp/static1/"), "/static"); 

// Add the CLStaticHttpHandler to serve static resources located at 
// the static2 folder from the jar file jersey1-grizzly2-spring-1.0-SNAPSHOT.jar 
server.getServerConfiguration().addHttpHandler(
     new CLStaticHttpHandler(new URLClassLoader(new URL[] { 
      new File("target/jersey1-grizzly2-spring-1.0-SNAPSHOT.jar").toURI().toURL()}), "webapp/static2/"), 
     "/jarstatic"); 

try { 
    server.start(); 

    System.out.println("In order to test the server please try the following urls:"); 
    System.out.println("http://localhost:3388/api to see the default TestResource.getIt() resource"); 
    System.out.println("http://localhost:3388/api/test to see the TestResource.test() resource"); 
    System.out.println("http://localhost:3388/api/test2 to see the TestResource.test2() resource"); 
    System.out.println("http://localhost:3388/static/ to see the index.html from the webapp/static1 folder"); 
    System.out.println("http://localhost:3388/jarstatic/ to see the index.html from the webapp/static2 folder served from the jar file"); 

    System.out.println(); 
    System.out.println("Press enter to stop the server..."); 
    System.in.read(); 
} finally { 
    server.shutdownNow(); 
} 
+0

Dzięki Alexey. Mam pytanie dotyczące uwierzytelniania na żądania zasobów statycznych z słoików, więc przez CLStaticHttpHandler kontra StaticHttpHandler. To nie jest udowodnione, ale wygląda na to, że uwierzytelnienie nie jest stosowane do pierwszego, ale jest stosowane do tego ostatniego? Ten wiersz w 'WebappContext' może wyjaśnić to:' if (! (H instanceof StaticHttpHandler)) '(grizzly-http-servlet-2.3.17.jar). Myśli? Dzięki. – user598656

+0

cóż, z tego, co znalazłeś, wygląda na to, że mogą wystąpić pewne problemy. Czy możesz to zrobić. udostępnić testrę na githubie - łatwiej będzie mi podwójnie sprawdzić. – alexey