2017-04-04 2 views
1

Je développe une application simple en utilisant Jersey 1.x, Guice et en essayant de tourner sur Tomcat. J'ai utilisé le filtre Guice et Guice Listener ainsi que les ressources et l'application.Problème avec Jersery1.x, Guice et Tomcat

Ci-dessous mon 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> 

Et en utilisant GuiceListener j'injectais toutes mes dépendances,

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; 
    } 
} 

Et voilà comment mon Servlet ressemble

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); 
    } 
} 

Et je créé une ressource avec une méthode 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; 
    } 
} 

J'ai utilisé Constructor Injection pour injecter des classes.

Et voilà comment ma demande semble

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

je déploie ce sur Tomcat 7 et lorsque je tente de frapper le point final d'application, je reçois 404,

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

I peut voir dans les journaux que toutes les classes sont instanciées avec succès.

Ce sont les dépendances dans mon pom.

<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> 

Y at-il quelque chose qui me manque en ce qui concerne Tomcat avec guice?

Répondre

2

Vous utilisez ServletModule. Utilisez JerseyServletModule à la place.

public class SimpleServlet extends JerseyServletModule 

Options de nettoyage général:

Quand je Guice/Tomcat/1.x Jersey je l'ai fait un peu différemment. Pour favoriser la flexibilité, vous pouvez retirer le paramètre path du paramètre chemin de SimpleResource et le déplacer vers la méthode. Peut également ajouter Singleton Annotation à la ressource directement.

@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; 
    } 
} 

Retirer SimpleApplication et configureGuiceServlet supprimer la réflexion et les options carte et à la place faire:

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

Comme mentionné j'ai changé mon servlet d'étendre à partir JerseyServletModule au lieu de ServletModule, et aussi suggéré que je changé le SimpleResource et SimpleServlet, mais je reçois toujours 404 comme mentionné. Ceci est un lien vers les changements https://github.com/sasidhar06/simpleproject – user1767288

+0

Pouvez-vous modifier votre message pour mettre à jour votre code à ce qu'il est maintenant s'il vous plaît afin que je puisse voir ce que c'est maintenant? –

+0

J'ai modifié mon message pour voir à quoi ressemble mon code maintenant – user1767288