Jersey JSON 应用程序构建失败

Jersey JSON application builds, fails

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

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

我将 @XmlRootElement 添加到 class。我们的项目使用 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 作为我们的服务器)。很明显,出了点问题。

我已经尝试了很多方法来解决这个问题,但我想不起来了,其中包括:

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

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

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

第二个问题当然是大问题:我该怎么做才能解决这个问题?

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

why would a new jar break an existing one?

因为您要添加的不仅仅是一个 jar。当使用像 Maven 或 Gradle 这样的依赖管理系统时,你处理的是 dependencies 而不仅仅是 jars,还有你显式列表可以有自己的依赖项,这些依赖项会隐式地引入。例如,如果您只添加 jersey-media-moxy,它会引入 10 多个额外的罐子。

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