java-无法使用Servlet 3可插入性功能将Jersey 2.16集成到Tomcat 8.0.12中

在新项目中,我决定将最新的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");
    }

}

因此,根据“ 4.7.2.2.使用web.xml描述符的部署”中的here描述的方案,它看起来是正确的.但是当我尝试调用任何JAX-RS资源时,Tomcat抛出NPE.似乎是由于web.xml中缺少servlet类元素.

解决方法:

看来您正在使用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部署).

使用前一种工件进行测试并得到与您相同的结果,并且使用后一种工件可以正常工作.

上一篇:java-如何使用Jersey REST处理服务不可用的情况


下一篇:Java-Dropwizard 0.8升级,过滤器错误