2012-03-19 62 views
0

我是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

回答

0

好吧,我发现这个问题。

这听起来有点不可思议,但问题是下面的(我没有在我的问题提到这个问题,原因,我从不认为这可能是导致问题的构建过程):

我定义在我的朋友最后的名字:

<build> 
<finalName>mytest</finalName> 

而这正是问题所在。当我删除这条线,一切工作完美...

有人可以告诉我为什么这是有问题的时候,建立一场战争时输入最终名称?

+1

我最近遇到了同样的问题。我认为解决方案实际上是在更改了finalName后进行了mvn清理。我在查看配置大约3个小时后,用mvn clean package解决了这个问题。我运行了mvn war:添加依赖项到我的pom之后复制我的依赖项。这让服务器成功启动,但我相信还有其他一些问题只能通过“mvn clean package”来解决。 – 2013-06-10 14:04:21

相关问题