在 Linux 上从 Jersey 返回 Json 会引发异常

Posted

技术标签:

【中文标题】在 Linux 上从 Jersey 返回 Json 会引发异常【英文标题】:Returning Json From Jersey on Linux Throws Exception 【发布时间】:2017-11-14 21:18:55 【问题描述】:

我开发了一个 Jersey API,它返回 XML 或 JSON(取决于请求标头)。当部署在我的 Windows 2012 服务器 (Tomcat) 上时,它可以正常工作。

当我部署(在 Ubuntu 上编译后)到 AWS (Glassfish) 中的 Ubuntu 机器时,我在请求 JSON 时收到以下错误:

The server encountered an internal error that prevented it from fulfilling this request.

exception javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper

root cause org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper

root cause java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper

我请求 XML 时没有错误。

我最初使用 moxy 进行 JSON 序列化,但后来开始使用 Jackson。

任何想法为什么它可以在一台服务器上运行而不是另一台服务器? 谢谢

【问题讨论】:

可能是 Glassfish 的错误。请参考this page。 @KoheiTAMURA 是的,我看到了。我想他们现在一定已经修好了。显然不是... 如果您将所有与 Jersey 相关的依赖项都设置为“已提供”怎么办?请记住,Tomcat 中没有 Jersey jar,因此没有冲突。但是 Glassfish 确实 有泽西岛。所以你的项目 jar 可能会发生冲突。所以你应该在部署到 Glassfish 时将它们排除在部署之外,而只使用 Glassfish 提供的那些。 @peeskillet 我试了一下,并为 moxy 包的依赖项添加了一个范围元素,其值为“提供”。我仍然遇到同样的错误。 你能用 glassfish 版本更新问题吗?好像是glassfish bug,见sentonimohere的评论 【参考方案1】:

终于搞定了。首先,使用 Tomcat,而不是 Glassfish。

然后,添加一个新的依赖:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
</dependency>

我还将 Jersey 版本升级到 2.26,但我认为这并没有什么不同。只是为了完整性而添加它(因为它确实发生了)。

我不明白它起作用的原因。我一直认为 Java 在 Windows 和 Linux 上的运行方式相同。但是,嘿,我只是一个愚蠢的 .NET 家伙。

希望这可以帮助那些像我一样在这个问题上陷入无助的人。

【讨论】:

以上是关于在 Linux 上从 Jersey 返回 Json 会引发异常的主要内容,如果未能解决你的问题,请参考以下文章

jersey 2.0 jaxrs RI - 在异常时返回 json 字符串

在 JSON 响应中返回文件/文件 (Java-Jersey-ReST)

返回带有 Jersey 的字符串的 JSON 表示

如何在 Tomcat 上的 JAX-RS (Jersey) 中返回 HTTP 404 JSON/XML 响应?

Java Atmosphere Jersey 从可广播返回 JSON 对象

JERSEY - 将javax.ws.rs.core.Response作为JSON对象返回,并带有错误:...或令牌: