【发布时间】:2017-09-27 20:40:33
【问题描述】:
我有一个公开多个 REST 端点的 Java Web 应用程序。他们都工作。它们可以被命中并返回预期的数据(纯文本)。我需要他们返回 JSON。为此,应用程序需要:
- 包括“jersey-media-moxy”jar
- 在我们想要转换为 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.jersey 和org.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