我想在我的项目中介绍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。
在向EntityResource添加Guice的构造函数注入后,它看起来像这样
final EntityService entityService;
@Inject
public EntityResource(EntityService entityService)
{
this.entityService = entityService;
}
@Path("")
@Produces("application/json")
@GET
public Entity getEntity() {
return entityService.getEntity();
}
这给出了错误"在参数索引0"处缺少构造函数public com.my.rest.EntityResource(com.my.service.EntityService)的依赖项。我猜这是因为Guice的构造函数注入。
答案 0 :(得分:2)
在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,仍然在寻找如何做到这一点。