在com.sun.jersey.guice.spi.container.servlet.GuiceContainer中找不到合适的构造函数

时间:2012-03-19 21:13:41

标签: java tomcat jersey guice

我是Guice的新手。 我想用RESTful Web服务和Guice for DI创建一个服务器应用程序。我按照教程here,而不是码头我使用Tomcat6。但我无法让它运行:(

我总是在应用程序启动时在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());
}}

最后但并非最不重要的是其他服务:

@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();
}}

我不知道我错过了什么。希望你能告诉我我做错了什么......

如果您需要任何进一步的信息,只需发表评论即可添加。

提前, TJ

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。

这听起来有点奇怪,但问题如下(我没有在我的问题中提到它,因为我从未暗示它可能是导致问题的构建过程):

我在我的pom中定义了一个最终名称:

<build>
<finalName>mytest</finalName>

这正是问题所在。当我删除这一行时,一切都很完美......

有人能告诉我为什么在建立战争时输入最终名称会有问题吗?