2017-04-04 70 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