无法使用servlet 3可插拔功能将Jersey 2.16集成到Tomcat 8.0.12中

时间:2015-03-04 09:34:23

标签: java tomcat jersey jersey-2.0 servlet-3.0

在新项目中,我决定使用最新的Jersey(2.16)和Tomcat 8,但文档中描述的集成方案会导致Tomcat抛出NPE:

java.lang.NullPointerException
org.apache.catalina.loader.WebappClassLoader.binaryNameToPath(WebappClassLoader.java:2503)
org.apache.catalina.loader.WebappClassLoader.findLoadedClass0(WebappClassLoader.java:2708)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1215)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1173)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2381)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2370)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:744)

这是我的web.xml

<servlet>
    <servlet-name>bla.bla.core.jersey.config.JerseyServerConfig</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>bla.bla.core.jersey.config.JerseyServerConfig</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

以下是JerseyServerConfig的列表:

package ru.huawei.rnd.bulksms.core.jersey.config;

import org.glassfish.jersey.server.ResourceConfig;
import ru.huawei.rnd.bulksms.core.jersey.constants.FILTERS_AND_INTERCEPTORS;
import ru.huawei.rnd.bulksms.core.jersey.constants.JERSEY_FEATURES;

public class JerseyServerConfig extends ResourceConfig {

    public JerseyServerConfig() {
        register(JERSEY_FEATURES.FORM_PROVIDER);
        register(JERSEY_FEATURES.MULTIPART);
        register(FILTERS_AND_INTERCEPTORS.USER_GZIP_FILTER);
        register(FILTERS_AND_INTERCEPTORS.GZIP_ENCODER);
        packages("bla.bla.rest");
    }

}

因此,根据&#34; 4.7.2.2中描述的here方案,它看起来是正确的。使用web.xml描述符&#34;进行部署。但是当我尝试调用任何JAX-RS资源时,Tomcat会抛出NPE。这似乎是因为web.xml中缺少servlet-class元素。

1 个答案:

答案 0 :(得分:3)

您似乎正在使用jersey-container-servlet-core依赖项。这将在我们声明servlet容器的情况下工作。但是当我们想要利用Jersey自动加载的功能时,我们需要jersey-container-servlet

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey.version}</version>
</dependency>

此工件具有JerseyServletContainerInitializer,它实现SerlvetContainerInitializer(用于Servlet 3.x部署)。

在使用前一个工件时测试并获得与您相同的结果,并使用后者工作正常。