java - Jersery1.x、Guice 和 Tomcat 的问题

标签 java tomcat guice jersey-1.0 guice-servlet

我正在使用 Jersey 1.x、Guice 开发一个简单的应用程序并尝试在 Tomcat 上运行。

我使用了 Guice 过滤器和 Guice 监听器以及资源和应用程序。

下面是我的 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 注入(inject)了我所有的依赖项,

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

我使用构造函数注入(inject)来注入(inject)类。

这就是我的应用程序的样子

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

我可以在日志中看到所有类都已成功实例化。

这些是我的 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>

就带 guice 的 Tomcat 而言,我还缺少什么吗?

最佳答案

您正在使用 ServletModule。请改用 JerseyServletModule。

public class SimpleServlet extends JerseyServletModule

常规清理选项:

当我使用 Guice/Tomcat/Jersey 1.x 时,我做了一些不同的事情。为了提高灵 active ,您可以将路径参数从 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);
    }
}

关于java - Jersery1.x、Guice 和 Tomcat 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216739/

相关文章:

java - 发出实例化 bean - 验证错误

java - Guice 注入(inject)器使用的最佳实践

java - 如何使用 Google Guice 创建需要参数的对象?

tomcat - 在 Tomcat 中部署 Cocoon 时出现问题

java - 使用 tomcat 服务器在 eclipse 中运行 java web 应用程序时系统重新启动

java - 使用 Google Guice 根据上下文绑定(bind)两个不同的接口(interface)实现

java - 如何使用java spring boot应用程序制作持久的JMS消息?

Java:如何从另一个线程启动 UI 对话框,例如对于身份 validator

java - 编写并发代码、非阻塞代码

java - 关于使用另一个 Web 服务的 Web 服务的建议