【问题标题】:Guice Servlet with Embedded Tomcat带有嵌入式 Tomcat 的 Guice Servlet
【发布时间】:2015-03-23 06:43:13
【问题描述】:

我正在尝试在我的项目中引入 Guice(v3.0)。我正在使用嵌入式 tomcat(v7.0.34) 和 Jersey(v1.18) 来托管休息服务。

在引入任何 Guice 依赖注入之前,我进行了以下配置

//Main Class
Context context = tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
    tomcat.addServlet(context, "Jersey REST Service", new ServletContainer(new DefaultResourceConfig(EntityResource.class)));
    context.addServletMapping( "/rest/*", "Jersey REST Service");
    tomcat.start();
    tomcat.getServer().await();


//EntityResource
@Path("entity")
public class EntityResource {    
final EntityService entityService;
public EntityResource()
{
    this.entityService = new EntityService();
}

@Path("")
@Produces("application/json")
@GET
public Entity getEntity(){
    return entityService.getEntity();
}

这很好用。我能够在 /rest/entity 上执行 GET。

在将 Guice 的构造函数注入添加到 EntityResource 之后,它看起来像这样

final EntityService entityService;
@Inject
public EntityResource(EntityService entityService)
{
    this.entityService = entityService;
}

@Path("")
@Produces("application/json")
@GET
public Entity getEntity() {
    return entityService.getEntity();
}

这会给出错误“在参数索引 0 处缺少构造函数公共 com.my.rest.EntityResource(com.my.service.EntityService) 的依赖项”。我猜这是因为 Guice 的构造函数注入。

【问题讨论】:

    标签: servlets jersey guice embedded-tomcat-7


    【解决方案1】:

    在 web.xml 中添加 servlet 使其工作

    //web.xml
    <web-app>
    <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>
    <listener-class>com.my.servlet.MyServletListener</listener-class>
    </listener>
    

    //MyServletListener
    public class MyServletListener extends GuiceServletContextListener {
    @Override
    public Injector getInjector() {
        return Guice.createInjector(new JerseyServletModule(){
            @Override
            protected void configureServlets() {
                bind(EntityResource.class);
                    bind(EntityService.class).to(com.my.impl.EntityService.class).in(Singleton.class);
                serve("/rest/*").with(GuiceContainer.class);
            }
        });
    }
    }
    

    仍在寻找如何在没有 web.xml 的情况下执行此操作。

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 2016-07-27
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2018-09-20
      • 1970-01-01
      相关资源
      最近更新 更多