【问题标题】:Jersey JSON application builds, failsJersey JSON 应用程序构建,失败
【发布时间】:2017-09-27 20:40:33
【问题描述】:

我有一个公开多个 REST 端点的 Java Web 应用程序。他们都工作。它们可以被命中并返回预期的数据(纯文本)。我需要他们返回 JSON。为此,应用程序需要:

  1. 包括“jersey-media-moxy”jar
  2. 在我们想要转换为 JSON 的任何 POJO 顶部包含 @XmlRootElement

我在课堂上添加了@XmlRootElement。我们的项目使用 gradle 构建。我在 build.gradle 文件的 dependencies 部分的底部添加了这一行:

compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.26'

它看起来和上面的那一行几乎一模一样:

compile group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: '2.22.2'

当然,名称和版本除外。它构建良好。我不得不将 jar (jersey-media-moxy-2.26.jar) 添加到我们的依赖层次结构中,但没什么大不了的。

它运行良好,直到用户登录。主屏幕上的一些组件丢失,并且它会出现错误(应用程序总是会出现错误,但它们是预期的)。新的错误是多种多样的,但重复的错误是:

SEVERE: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: jersey/repackaged/com/google/common/base/Predicate
   at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
   at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
   at javax.servlet.GenericServlet.init(GenericServlet.java:158)
...

堆栈跟踪从不包含我们的任何源代码作为罪魁祸首。都是org.glassfish.jerseyorg.apache.catalina.core 错误(我们使用Tomcat 作为我们的服务器)。很明显,出了点问题。

我尝试了比我想回想的更多的方法来解决它,但其中包括:

  • jersey-media-moxy 添加到我们拥有的大约 40 个依赖项的不同位置(没有区别
  • 显式添加所有 jersey-media-moxy 依赖项(即使没有它们也可以正常构建;没有区别
  • 删除 jersey-media-multipart 依赖项(构建失败
  • 废弃工作区并从源代码管理中重新“获取”,然后重新添加 jersey-media-moxy 依赖项(没有区别
  • jersey-media-multipart 升级到最新版本(无法构建
  • 删除了jersey-media-moxy 依赖,看看我是否真的需要它(谁知道?也许jersey-media-multipart 已经包含它)并将我要返回的对象更改为一个非常简单的类(它只包含一个string) . (失败了,确实需要jersey-media-moxy

我是这里唯一的 Java 开发人员,这是我第一次使用 gradle 或 Jersey。我知道还有其他生成 JSON 的方法(例如使用 gson),但我们真的希望 Jersey 这样做,因为我们已经在使用该框架了。

我们使用 Eclipse (Oxygen) 作为我们的 IDE 和 Tomcat 作为我们的服务器。

我的一个大问题是为什么一个新的罐子会破坏现有的罐子?

当然,第二个问题是大问题:我能做些什么来解决这个问题?

【问题讨论】:

  • 您的 2.26 和 2.22.2 差异可能是问题所在。不要混合您的 Jersey 模块版本。
  • 好吧,该死,@peeskilet,就是这样!我希望您已将其发布为答案,以便我可以将其标记为这样。将版本号升级到 2.26 不起作用,但降级到 2.22.2 可以。非常感谢!不知道这一点我觉得很愚蠢,但我现在有一个可以工作的应用程序!

标签: java json rest tomcat jersey


【解决方案1】:

您的 2.26 和 2.22.2 差异可能是问题所在。不要混合您的 Jersey 模块版本。

为什么新罐子会破坏现有罐子?

因为您添加的不仅仅是一个 jar。当使用 Maven 或 Gradle 之类的依赖管理系统时,您正在处理 dependencies 而不仅仅是 jars,并且您显式列出的那些可以具有自己的隐式获取的依赖项拉进来。例如,如果你只添加jersey-media-moxy,它会拉进来10多个额外的罐子。

这样做的问题是,如果您使用不兼容的版本,jersey-media-moxyjersey-media-multipart 都会拉入一些相同的 jar,这样您就不能拥有多个版本的类。所以只会使用这两个 jar 中的一个类。如您所知,软件会随着版本的变化而变化。所以一个类可能试图使用一个存在于一个版本中而不是另一个版本中的类。如果您没有正确管理依赖项版本,这只是您可能面临的问题之一。

【讨论】:

  • 正如我上面提到的,这解决了我的问题。将所有版本更改为 2.22.2 修复了所有错误并在我的应用程序中启用了 JSON。感谢您更深入的解释。
猜你喜欢
  • 2017-08-29
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 2020-05-05
  • 2017-11-21
相关资源
最近更新 更多