2017-09-27 22 views
0

我有一個公開幾個REST端點Java Web應用程序。他們都工作。他們可以被擊中並返回預期的數據(純文本)。我需要他們返回JSON。要做到這一點,應用程序需要:澤西JSON構建應用程序,失敗

  1. 包括「新澤西媒體MOXY」罐子
  2. 包括@XmlRootElement頂上任何POJO我們要轉換成JSON

我加入了@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作爲我們的服務器)。顯然,有些事情是錯的。

我已經嘗試更多的東西比我喜歡回憶來解決它,但一些包括:

  • 在40場左右的依賴,我們有一個不同的位置添加jersey-media-moxy沒有區別
  • 明確將所有的jersey-media-moxy依賴(即使它關掉了他們的罰款; 沒有區別
  • 卸下jersey-media-multipart依賴(構建失敗
  • 刮痧工作區,做一個新的從源頭控制「得到」,並重新添加jersey-media-moxy依賴(沒有區別
  • jersey-media-multipart到最新的版本(沒有按」牛逼構建
  • 刪除了jersey-media-moxy依賴,看看我是否真的需要它(誰知道?也許jersey-media-multipart已經包含了它),並改變了我就要回一個非常簡單的類對象(它只是包含了string)。 (失敗,它確實需要jersey-media-moxy

我這裏是唯一的Java開發人員,這是我第一次使用或的gradle新澤西州。還有其他方法可以生成JSON,我知道(比如使用gson),但我們真的希望讓Jersey做到這一點,因爲我們已經在使用該框架了。

我們使用Eclipse(Oxygen)作爲我們的IDE和Tomcat作爲我們的服務器。

我有一個大問題是爲什麼新的jar打破了現有的jar?

第二個問題是大問題,當然是:我該怎麼辦才能解決這個問題?

+1

您的2.26和2.22.2差異可能是問題所在。不要混用你的澤西模塊版本。 –

+0

呃,dang,@peeskilet,就是這樣!我希望你已經發布了這個答案,所以我可以將其標記爲這樣。將版本號提高到2.26無效,但降級到2.22.2。非常感謝!我不知道這一點,我感到很蠢,但我現在有一個工作的應用程序! – Frecklefoot

回答

1

您的2.26和2.22.2差異可能是問題所在。不要混用你的澤西模塊版本。

爲什麼新的jar會破壞現有的jar?

因爲它不只是一個單一的罐子,你正在添加。當使用像Maven或Gradle這樣的依賴關係管理系統時,您正在處理依賴關係而不僅僅是罐子,並且您明確列出的那些可能具有它們自己的依賴關係,這些依賴關係隱式地被拉入。例如,如果您只是添加jersey-media-moxy,它會像10個額外的罐子一樣拉入。

問題是如果您使用不兼容版本,則jersey-media-moxyjersey-media-multipart都會拉入一些相同的瓶子,因此您不能擁有一個類的多個版本。所以只有兩個瓶子中的一個會被使用。如你所知,軟件隨版本變化而變化。所以一個類可能試圖使用一個版本中存在的類而不是另一個版本。如果你不正確地管理你的依賴關係版本,這只是你可能面臨的問題之一。

+0

正如我上面提到的,這解決了我的問題。將所有版本更改爲2.22.2將修復所有錯誤並在我的應用程序中啓用JSON。感謝您的更深入的解釋。 – Frecklefoot