Jersey JSON应用程序构建失败

时间:2017-09-27 20:40:34

标签: java json rest tomcat jersey

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

  1. 包括“jersey-media-moxy”jar
  2. 在我们想要转换为JSON的任何POJO上包含@XmlRootElement
  3. 我在课堂上添加了@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),但我们真的希望泽西做它,因为我们已经在使用框架了。

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

    我遇到的一个重要问题是为什么新罐子会破坏现有罐子?

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

1 个答案:

答案 0 :(得分:1)

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

  

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

因为您要添加的不仅仅是一个 jar 。当使用像Maven或Gradle这样的依赖管理系统时,您正在处理依赖而不仅仅是 jars ,而您明确列出的那些可以拥有自己的隐式获取的依赖关系拉入。例如,如果您只是添加jersey-media-moxy,它会像10个额外的罐子一样拉入。

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