2017-04-04 14 views
1

Ich entwickle eine einfache Anwendung mit Jersey 1.x, Guice und versuchen, auf Tomcat zu laufen.Problem mit Jersery1.x, Guice und Tomcat

Ich benutzte Guice-Filter und Guice Listener zusammen mit Ressourcen und Anwendung.

Unten ist mein 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> 

Und mit GuiceListener ich meine Abhängigkeiten alle,

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

Und Dies ist injiziert, wie meine Servlets

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

Und ich sieht erstellt eine Ressource mit einer GET-Methode,

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

Ich habe Constructor Injection zum Einspritzen von Klassen verwendet.

Und das ist, wie meine Anwendung

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

sieht ich das auf Tomcat bin Bereitstellung von 7 und wenn ich versuche, die Anwendung Endpunkt zu schlagen, erhalte ich 404

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

I kann in den Protokollen sehen, dass alle Klassen erfolgreich instanziiert wurden.

Dies sind die Abhängigkeiten in meinem 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> 

Gibt es etwas, das ich bis Tomcat mit guice vermisse?

Antwort

2

Sie verwenden ServletModule. Verwenden Sie stattdessen JerseyServletModule.

public class SimpleServlet extends JerseyServletModule 

Allgemeine Bereinigungsoptionen:

Wenn ich Guice/Tomcat/Jersey 1.x verwendet habe ich es ein bisschen anders. Um die Flexibilität zu erhöhen, können Sie den Path-Parameter von SimpleResource 'path param entfernen und in die Methode verschieben. Sie können der Ressource auch direkt Singleton Annotation hinzufügen.

@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 entfernen und in configureGuiceServlet entfernen Reflexion und Optionen Karte und stattdessen tun:

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

Wie bereits erwähnt ich meine Servlet geändert von JerseyServletModule statt ServletModule zu erweitern, und auch vorgeschlagen, änderte ich den SimpleResource und SimpleServlet, aber ich bekomme immer noch 404 wie erwähnt. Dies ist Link zu den Änderungen https://github.com/sasidhar06/simpleproject – user1767288

+0

Können Sie Ihren Beitrag bearbeiten, um Ihren Code zu aktualisieren, was es jetzt ist, bitte, damit ich sehen kann, was es jetzt ist? –

+0

Ich bearbeitet meinen Beitrag, wie mein Code jetzt aussieht – user1767288