2013-03-05 2 views
4

Guice 서블릿이 작동하여 Jetty가 정적 요청에 대해 웹 요청을 처리하는 방법을 구성하는 데 어려움을 겪고 있습니다.web.xml을 사용하지 않고 Jetty에서 Guice Servlet을 사용하여 servlet에 경로 매핑

GuiceServlet을 사용하는 두 개의 다른 요청을 매핑하는 간단한 애플리케이션을 만들었습니다. 후자는 작동하지만 GuiceServlet 매핑 된 404 오류를 반환합니다.

팁이 있습니까? 내가 사용하고있다 : JDK 1.7.0_15; eclipse.jetty.jetty-servlet 8.1.9.v20130131; guice-servlet 3.0. 감사.

public class Main { 
    public static void main(String... args) { 
     Guice.createInjector().getInstance(Main.class).start(); 
    } 

    public void start() { 
     Server server = new Server(8080); 
     ServletContextHandler handler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); 
     handler.addEventListener(new MyGuiceServletConfig()); 
     handler.addServlet(MyServlet.class, "/non-guice"); 
     server.setHandler(handler); 
     try { 
      server.start(); 
      server.join(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }  
    } 
} 

public class MyGuiceServletConfig extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(new ServletModule() { 
      @Override 
      protected void configureServlets() { 
       System.out.println("MyGSC->getInjector->configureServlets"); //I'm seeing this in the console... 
       serve("/guice").with(MyServlet.class); 
      } 
     }); 
    } 
} 

@Singleton 
public class MyServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.getWriter().print("Hello!\nYour path is: " + request.getServletPath());   
    } 
} 

이 외에도 다양한 인젝터를 만드는 가장 좋은 방법은 무엇입니까? 나는 메인 (..) 구조를 가지고 있으므로 다른 모듈을 연결할 수 있으므로 MyServletModule을 MyGuiceServletConfig에 지정하도록 남겨둔다.

답변

3

나는 작동하는 방법으로,이 할 수있는 훨씬 간단하게 끝났다. 은 "/"경로에 대한 DefaultServlet을 추가해야했습니다 :

public class MyMain { 
    public static void main(String... args) throws Exception { 
     Guice.createInjector(new MyServletModule()); 
     Server server = new Server(8080);  
     ServletContextHandler handler = 
      new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); 
     handler.addFilter(GuiceFilter.class, "/*", allOf(DispatcherType.class)); 
     handler.addServlet(DefaultServlet.class, "/"); 
     server.start(); 
    } 
} 

@Singleton 
public class MyServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.getWriter().print("Hello!\nYour path is: " + request.getServletPath());   
    } 
} 

public class MyServletModule extends ServletModule { 
    @Override 
    protected void configureServlets() { 
     serve("/guice").with(MyServlet.class); 
    } 
} 
1

Jetty가 정적 컨텐츠를 제공하게하려면 DefaultServlet도 구성해야합니다. 부두 포함 된 예제 트리에서 발견

예 : OneServletContext.java

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.servlet.DefaultServlet; 
import org.eclipse.jetty.servlet.ServletContextHandler; 
import org.eclipse.jetty.servlet.ServletHolder; 

public class OneServletContext 
{ 
    public static void main(String[] args) throws Exception 
    { 
     Server server = new Server(8080); 

     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.setContextPath("/"); 
     server.setHandler(context); 

     // Serve static content from /tmp 
     ServletHolder holder = context.addServlet(DefaultServlet.class,"/tmp/*"); 
     holder.setInitParameter("resourceBase","/tmp"); 
     holder.setInitParameter("pathInfoOnly","true"); 

     // Serve some hello world servlets 
     context.addServlet(new ServletHolder(new HelloServlet()),"/*"); 
     context.addServlet(new ServletHolder(new HelloServlet("Buongiorno Mondo")),"/it/*"); 
     context.addServlet(new ServletHolder(new HelloServlet("Bonjour le Monde")),"/fr/*"); 

     server.start(); 
     server.join(); 
    } 
} 

http://localhost:8080/tmp/의 URL의 컨텍스트 경로와 같은 파일 시스템 디렉토리 /tmp에서 콘텐츠를 제공합니다.

예 :

File System  URL 
/tmp/hello.txt http://localhost:8080/tmp/hello.txt 
/tmp/a/hi.txt  http://localhost:8080/tmp/a/hi.txt 
/tmp/index.html http://localhost:8080/tmp/ 
+0

그것은이 생각없이 일반적으로 ("/ 비 guice")를 추가 서블릿을 제공을 위해 잘 작동하는 것 같다? 나는 그 질문을 잘못 표기했을지도 모른다. – neuronotic

+0

내가 가지고있는 문제는 Guice 외부에서 프로그래밍 방식으로 지정하면 HelloWorld 스타일 서블릿을 제공 할 수 있지만 Guice 서블릿을 통해 지정된 것은 작동하지 않는다는 것입니다. – neuronotic

+0

아, 그 경우 guiceFilter를 올바르게 설정하십시오. http://code.google.com/p/google-guice/wiki/Servlets –