java - Resteasy 部署在 glassfish 4.1 上随机失败

标签 java glassfish resteasy servlet-3.0

我的 REST 应用程序在使用 Resteasy 时遇到问题。 当我部署具有此依赖项的应用程序时

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-servlet-initializer</artifactId>
    <version>3.0.11.Final</version>
</dependency>

如第 3.5 章中的 here 所描述,有时服务器会正​​确部署应用程序并且一切正常。

但有时我会得到

Error invoking ServletContainerInitializer 
org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer
java.lang.NullPointerException
    at org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer.register(ResteasyServletInitializer.java:109)
    at org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer.onStartup(ResteasyServletInitializer.java:80)
    at org.apache.catalina.core.StandardContext.callServletContainerInitializers(StandardContext.java:6031)
    at com.sun.enterprise.web.WebModule.callServletContainerInitializers(WebModule.java:774)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5929)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2286)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1932)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:139)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:500)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:406)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:243)
    at org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:329)
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:377)
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461)
    at org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:227)
    at org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:84)
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2258)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:105)
    at org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87)
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1162)
    at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run(CurrentTaskFuture.java:1147)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
]]

在 ResteasyServletInitializer 的源代码中,第 109 行是这样的(带有上下文)

ServletRegistration.Dynamic reg = servletContext.addServlet(applicationClass.getName(), HttpServlet30Dispatcher.class);
reg.setLoadOnStartup(1); //Line 109
reg.setAsyncSupported(true);
reg.setInitParameter("javax.ws.rs.Application", applicationClass.getName());

所以我认为这是一个 Glassfish 错误,并且 Glassfish 无法正确返回正确的对象。 我还没有发现这种情况发生在重新部署、清除 osgi-cache 等之后。这似乎是相当随机的。

This 似乎相关,我尝试添加

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

但有时它仍然会失败,尽管我想说它失败的频率要少一些。 帖子中接受的答案已被 Resteasy 引用 3.9. RESTEasy as a ServletContextListener 弃用,所以我不想尝试这个。 这似乎是在逃避问题,而不是解决问题。

我的 Glassfish 版本是 GlassFish Server Open Source Edition 4.1(内部版本 13)。

请帮我解决这个问题。

干杯

最佳答案

我最终通过确保应用程序 WAR 不包含 RESTEasy 避免了这个问题。

因此,我现在构建了两场 war :一场使用 RESTEasy(根据在 Tomcat 和 Wildfly 上部署的要求),另一场不使用 RESTEasy(根据在 Glassfish 上部署的要求)。这似乎比需要更改 Glassfish 安装更好,但效果相同:避免安装两个 JAX-RS 实现。

关于java - Resteasy 部署在 glassfish 4.1 上随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31435475/

相关文章:

json - 在 JBoss 7.1.1 上的 RESTEasy 中设置 JSON 提供程序

java - jni - 应用程序崩溃

java - SWT TableViewer 在单元格中具有多个图标

java - 如何将 .dat 文件导入到多个数组中

hibernate - 如何将 SLF4J 用于部署在带有 Hibernate JPA 的 GlassFish 3 上的 Java EE Web 应用程序?

java - Postgresql 和 GlassFish - 启用自动提交时无法提交

java - 安装了JDK但没有javap?

mysql - 配置 GlassFish JDBC 连接池以处理 Amazon RDS 多可用区故障转移

java - RESTEASY003145 : Unable to find a MessageBodyReader of content-type application/json and type class org. keycloak.representations.AccessTokenResponse

java - 跨 GWT 和 Appengine 开发模式的 JUnit 集成测试,使用 RESTEasy