ArrayIndexOutOfBoundsException 在没有 web.xml Jersey 的情况下部署到 GlassFish 4.1.1

ArrayIndexOutOfBoundsException deploying to GlassFish 4.1.1 with no web.xml Jersey

我在使用 Maven glassfish 插件将我的 Jersey 服务器(没有 web.xml)部署到 GlassFish 4.1.1 时遇到了这个奇怪的错误(事实上,我已经将我的 (Maven) 构建从嵌入式 Grizzly 切换到 GlassFish,将标准 Jersey 依赖项从编译更新为提供):

[ERROR] remote failure: Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang.ArrayIndexOutOfBoundsException: 0. Please see server.log for more details

当我没有在 ResourceConfig 实现中声明 @ApplicationPath 时,部署成功。但是后来,我在尝试使用该服务时遇到了 404 错误。根据 Jersey 文档,@ApplicationPath 不需要 web.xml 部署 (Example 4.3)。

部署错误日志摘录如下:

[2015-12-28T09:33:40.826+0800] [glassfish 4.1] [SEVERE] [] [javax.enterprise.web] [tid: _ThreadID=123 _ThreadName=admin-listener(6)] [timeMillis: 1451266420826] [levelValue: 1000] [[
WebModule[/BBQuay-Entertainment-1.0-SNAPSHOT]StandardWrapper.Throwable java.lang.ArrayIndexOutOfBoundsException: 0 at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:505) at org.glassfish.jersey.server.ApplicationHandler.access0(ApplicationHandler.java:182) at org.glassfish.jersey.server.ApplicationHandler.call(ApplicationHandler.java:348) at org.glassfish.jersey.server.ApplicationHandler.call(ApplicationHandler.java:345) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:345) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:390) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:362) at javax.servlet.GenericServlet.init(GenericServlet.java:244) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583)

.....

Glassfish 4.1.1(没有web.xml)以下内容就足够了:

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("rest")
public class ApplicationConfig extends ResourceConfig {
}

还有一个例子class:

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("info")
public class InfoStub {

    @GET
    public String getInfo() {
        return "hello sir";
    }
}

您可以在 http://localhost:8080/YOUR_PROJECT_NAME/rest/info

下访问它

确保将 pom.xml 中的标准 Jersey 依赖项设置为 provided

原来是Maven配置。由于我之前使用 Grizzly 进行测试,当切换到 GlassFish 时,我保留了两个依赖项 jersey-weld2-sejersey-cdi1x 默认 Maven 范围.后者很好,但第一个是由 GlassFish 容器提供的。更正如下有助于解决问题(虽然部署错误确实没有帮助..)

<dependency>
    <groupId>org.glassfish.jersey.ext.cdi</groupId>
    <artifactId>jersey-weld2-se</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext.cdi</groupId>
    <artifactId>jersey-cdi1x</artifactId>
</dependency>