2017-04-04 39 views
1

我正在開發一個簡單的應用程序,使用Jersey 1.x,Guice並嘗試在Tomcat上運行。問題與Jersery1.x,Guice和Tomcat

我使用了Guice過濾器和Guice Listener以及資源和應用程序。

下面是我的web.xml:

<filter> 
    <filter-name>guiceFilter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>guiceFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<listener> 
    <display-name>Guice Listener</display-name> 
    <listener-class>com.simple.application.GuiceListener</listener-class> 
</listener> 

而且使用GuiceListener我注入我所有的依賴關係,

public class GuiceListener extends GuiceServletContextListener { 
    private Injector injector; 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
     try { 
      super.contextDestroyed(servletContextEvent); 
     } finally { 
      injector = null; 
     } 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     injector = Guice.createInjector(new SimpleServlet()); 
     super.contextInitialized(servletContextEvent); 
     injector.injectMembers(this); 
    } 

    @Override 
    protected Injector getInjector() { 
     return injector; 
    } 
} 

,這是我的Servlet的樣子

public class SimpleServlet extends JerseyServletModule { 
    @Override 
    protected void configureServlets() { 
     configureGuiceServlet(); 
    } 

    private void configureGuiceServlet() { 
     bind(SimpleResource.class).in(Scopes.SINGLETON); 
     serve("/service/*").with(GuiceContainer.class); 
     bind(Manager.class).to(ManagerImpl.class); 
    } 
} 

我用GET方法創建資源,

@Path("/stuff") 
public class SimpleResource { 
    private final ManagerImpl manager; 

    @Inject 
    public SimpleResource(final ManagerImpl manager) { 
     this.manager = manager; 
    } 

    @GET 
    @Path("{id}") 
    @Produces(MediaType.TEXT_HTML) 
    public String submitData(@PathParam("id") final String id) { 
     String welcomeScreen = manager.getWelcomeScreen(); 
     return "This is" + welcomeScreen + id; 
    } 
} 

我使用Constructor Injection來注入類。

這是我的應用程序的外觀

public class SimpleApplication extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     return ImmutableSet.<Class<?>>builder() 
      .add(SimpleResource.class) 
      .build(); 
    } 
} 

我在Tomcat 7部署此,當我試着打了應用終端,我得到404,

http://localhost:9999/simple-0.0.1-SNAPSHOT/service/stuff/id

我可以在日誌中看到所有類都已成功實例化。

這些是我的朋友的依賴關係。

<dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>1.18.6</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey.contribs</groupId> 
     <artifactId>jersey-guice</artifactId> 
     <scope>compile</scope> 
     <version>1.18.6</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.inject.extensions</groupId> 
     <artifactId>guice-servlet</artifactId> 
     <scope>compile</scope> 
     <version>3.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <scope>provided</scope> 
     <version>2.5</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <scope>compile</scope> 
     <version>14.0</version> 
    </dependency> 
</dependencies> 

有什麼,我失蹤,只要Tomcat與Guice?

回答

2

您正在使用ServletModule。改用JerseyServletModule。

public class SimpleServlet extends JerseyServletModule 

一般清理選項:

當我使用的吉斯/ Tomcat的/ 1.x的球衣我做的有點不同。爲了提高靈活性,您可以將路徑參數從SimpleResource的路徑參數中移走並將其移至該方法。也可以直接將Singleton Annotation添加到資源。

@Singleton 
@Path("/stuff") 
public class SimpleResource { 
    private final ManagerImpl manager; 

    @Inject 
    public SimpleResource(final ManagerImpl manager) { 
     this.manager = manager; 
    } 

    @GET 
    @Path("{id}") 
    @Produces(MediaType.TEXT_HTML) 
    public String submitData(@PathParam("id") final String id) { 
     String welcomeScreen = manager.getWelcomeScreen(); 
     return "This is" + welcomeScreen + id; 
    } 
} 

刪除SimpleApplication和configureGuiceServlet刪除反思和選擇地圖,轉而做:

public class SimpleServlet extends JerseyServletModule{ 

    @Override 
    protected void configureServlets() { 
     configureGuiceServlet(); 
    } 

    private void configureGuiceServlet() { 
     serve("/service/*").with(GuiceContainer.class, new HashMap<String, String>()); 
     bind(Manager.class).to(ManagerImpl.class); 
    } 
} 
+0

如前所述,我改變我的servlet從JerseyServletModule代替的servlet延伸,也可作爲建議我改變了SimpleResource和SimpleServlet,但我仍然提到404。這是鏈接到變化https://github.com/sasidhar06/simpleproject – user1767288

+0

你可以編輯你的帖子來更新你的代碼,現在它是什麼,所以我現在可以看到它是什麼? –

+0

我編輯我的文章,以我的代碼看起來如何 – user1767288