GrizzlyWebServer + Spring + Jersey + serve static content from within JAR
Asked Answered
V

1

5

I'm trying to deploy Jersey-Spring based REST API using Grizzly's com.sun.grizzly.http.embed.GrizzlyWebServer. I also want to serve static content using the same. Here is what I have:

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" works fine but I am not able to get the static content present in "webapp" folder to be served (404 Error).

My project folder structure is as follows:

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

Am I making a mistake in providing the path for "webapp" in the line new GrizzlyWebServer(host, port, "webapp", false); ??

Or, is there any other way to serve static content ??

Vazquez answered 21/8, 2013 at 7:26 Comment(0)
S
7

Here is a sample on how to serve Jersey-Spring resources + static content from a folder and from a jar file working on top of Grizzly2.

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

The server code looks like:

// 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();
}
Shah answered 21/8, 2013 at 21:17 Comment(2)
Thanks Alexey. I have a question about authentication on requests for static resources from jars, so via CLStaticHttpHandler versus StaticHttpHandler. This is unproven but it looks that authentication isn't applied to the former but is applied to the latter? This line in WebappContext may explain this: if (!(h instanceof StaticHttpHandler)) (grizzly-http-servlet-2.3.17.jar). Thoughts? Thanks.Lavellelaven
well, from what you found it looks like there could be some problems. Can you pls. share the testcase on a github - it'll be easier for me to doublecheck.Shah

© 2022 - 2024 — McMap. All rights reserved.