resteasy + tomcat servlet容器3.0 + guice无法正常工作

时间:2016-12-09 05:32:25

标签: tomcat7 guice resteasy

我试图让resteasy 3.0.19,guice 4.0和tomcat 7.0.73一起工作,我试图获得除404响应之外的其他东西。要进行故障排除,我只是试着让guice-hello示例工作,稍加修改。在启动时,我看到HelloModuleHelloResource被选中并注册。

23:09:29.875 [RMI TCP Connection(3)-127.0.0.1] INFO org.jboss.resteasy.plugins.guice.i18n - RESTEASY011005: found module: org.jboss.resteasy.examples.guice.hello.HelloModule
23:09:30.169 [RMI TCP Connection(3)-127.0.0.1] INFO org.jboss.resteasy.plugins.guice.i18n - RESTEASY011020: registering factory for org.jboss.resteasy.examples.guice.hello.HelloResource
[2016-12-08 11:09:30,250] Artifact Gradle : abbvie.ir.pikm : people.service.war (exploded): Artifact is deployed successfully
[2016-12-08 11:09:30,250] Artifact Gradle : abbvie.ir.pikm : people.service.war (exploded): Deploy took 3,172 milliseconds

但是,当我尝试访问http://localhost:8080/people.service/hello/test时,我从tomcat获得了404页面。还有一点要注意,如果我访问http://localhost:8080/garbage,我也会获得404状态,但我没有获得404状态页面,只是一个空白页面。

由于这是一个3.0 servlet容器,我没有在web.xml中定义任何调度程序servlet。它看起来像:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0" metadata-complete="true">

    <display-name>People Service</display-name>

    <context-param>
        <param-name>resteasy.guice.modules</param-name>
        <param-value>
            org.jboss.resteasy.examples.guice.hello.HelloModule
        </param-value>
    </context-param>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener
        </listener-class>
    </listener>

</web-app>

所有其他类只是guice-hello示例中的默认类,即HelloModule,HelloResource,Greeter和DefaultGreeter。在我看来,默认调度程序不处理定义的请求。有关排除故障的任何想法吗?

1 个答案:

答案 0 :(得分:0)

逐步执行resteasy代码,我发现问题是在ResteastServletInitializer中,用于servlet 3.0容器,如果没有定义Application类,那么它会跳过HttpServlet30Dispatcher的配置{1}}。有handleNoApplicationClass方法,但此时此方法似乎不完整。

解决方案是定义以下类:

package abbvie.ir.pikm.people.service;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class PeopleServiceApplication extends Application {
}