我是Guice的新手。 我想用RESTful Web服务和Guice for DI创建一个服务器应用程序。我遵循教程here,而不是使用Tomcat6的码头。但我不能让它跑:(在com.sun.jersey.guice.spi.container.servlet.GuiceContainer中找不到合适的构造函数
我总是得到无法在应用程序启动时发现com.sun.jersey.guice.spi.container.servlet.GuiceContainer合适的构造。
异常将上下文初始化事件发送给类de.server.MyGuiceServletConfig的监听器实例 com.google.inject.CreationException:Guice创建错误: 1)在com.sun.jersey.guice.spi.container中找不到合适的构造函数。 servlet.GuiceContainer。类必须有一个(且只有一个)用@Inject注释的构造函数或一个非私有的零参数构造函数。 在com.sun.jersey.guice.spi.container.servlet.GuiceContainer.class(GuiceContainer.java:108) 在com.sun.jersey.guice.JerseyServletModule.webApp(JerseyServletModule.java:90)
GuiceContainer类具有一个带@Inject语句的构造函数,它需要一个Injector。
@Inject
public GuiceContainer(Injector injector) {
this.injector = injector;
}
我的web.xml文件看起来是这样的:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<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>de.server.MyGuiceServletConfig</listener-class>
</listener>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
我的配置类看起来是这样的:
public class MyGuiceServletConfig extends GuiceServletContextListener {
public MyGuiceServletConfig() {
}
public class MyJerseyServletModule extends JerseyServletModule {
@Override
protected void configureServlets() {
// Must configure at least one JAX-RS resource or the
// server will fail to start.
bind(ITest.class).to(Test2.class);
bind(TestRestService.class);
serve("/*").with(GuiceContainer.class);
}
}
@Override
protected Injector getInjector() {
return Guice.createInjector(new MyJerseyServletModule());
}}
最后但并非最不重要的REST服务:
@Path("/test")
public class TestRestService {
private ITest test;
@Inject
public TestRestService(ITest t){
this.test = t;
}
@GET
@Path("/getMe")
public String getMe() {
return test.getName();
}
@GET
@Path("/getAll")
public Response getAll() {
return Response.status(200).entity("sadsads").build();
}}
我不知道我在想什么。希望你能告诉我我做错了什么...
如果您需要更多信息,只需留下评论,我会添加它。
Thx提前, TJ
我最近遇到了同样的问题。我认为解决方案实际上是在更改了finalName后进行了mvn清理。我在查看配置大约3个小时后,用mvn clean package解决了这个问题。我运行了mvn war:添加依赖项到我的pom之后复制我的依赖项。这让服务器成功启动,但我相信还有其他一些问题只能通过“mvn clean package”来解决。 – 2013-06-10 14:04:21