2015-04-03 80 views
1

我試圖實現Jersey框架以便使用restful方法路由我們的客戶端請求。我已經成功地創建了讀取原始參數的方法,發送它們,甚至可以用對象的JSON響應。然而,我無法做的一件事是從post/put甚至get請求中讀取(即消耗)json對象。我嘗試了一切我可以在網上找到,但無濟於事。由於一些工作問題,我使用Java 6和Jersey 1.19進行了限制。對於我們客戶端的東西,我們使用ExtJS。使用Jersey和ExtJS消耗JSON的其他Web服務

我的ExtJS的請求被格式化爲這樣:

Ext.Ajax.request({ 
url: 'rest/RestClass/getMessage', 
method: 'PUT', 
header: { 
    'Content-Type': 'application/json' 
}, 
jsonData: { 
    status: { 
     id: 1, 
     description: 'Description' 
    } 
}, 
success: function(response) { 
    var result = response.responseText; 
}, 
failure: function(response) { 
    Ext.Msg.alert('Communication Error', 'Failed'); 
} 
}); 

至於我的後臺的東西去我有這樣的:

@PUT 
@Path("/getMessage") 
@Consumes(MediaType.APPLICATION_JSON) 
public void getMsg(JAXBElement<Status> status) { 
    System.out.println("status id = " + status.getValue().getId()); 
    System.out.println("status description = " + status.getValue().getDescription()); 
} 

而且我的狀態對象是:

@XmlRootElement 
public class Status{ 

    private int id; 
    private String description; 

    public Status() { 

    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getDescription() { 
     return description; 
    } 
} 

由於我已經發送了成功的請求,因此我已經正確映射了球衣小服務程序等。我的問題是,當我嘗試發送一個帶有json對象的參數時,我得到錯誤。

起初,我得到一個缺失jackson圖書館的錯誤,即使我使用jersey-bundle-1.19.jar,它應該包含所需的一切。下載jackson-jaxrs-1.9.13.jar和增加它的項目後,我現在收到此錯誤:

A message body reader for Java class javax.xml.bind.JAXBElement, and Java type javax.xml.bind.JAXBElement, and MIME media type application/json was not found.

我甚至增加了一些jaxb罐,以防萬一,但仍然得到同樣的錯誤。我在網上看到的很多例子都不適合我。他們都使用Maven的依賴控制,我們無法訪問,所以我不能確定我們正在使用相同的庫...

我在這裏尋找的是我有的東西的解決方案: 球衣1.19 ExtJS的5 JDK 6 的WebLogic 10.X

的目標是能夠與一個JSONObject作爲參數發送請求,並讓被解碼服務器側到現有的對象類型。

編輯:我甚至增加POJO映射在我的web.xml(我在網上找到它需要的球衣,以支持JSON /對象映射)

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 

仍然有同樣的問題。客戶給我一個415 error for unsupported media type

+0

爲什麼要發送JAXBElement 類型?它應該只是狀態。像:public void getMsg(狀態狀態)。您不需要註釋:@XmlRootElement – facundofarias 2015-04-03 13:06:13

+0

因爲我看到的所有示例都有這些註釋。我終於找到了答案,是的,它不需要這些註釋。然而,它需要我的模型構造函數的@JsonCreator註解。 – Konstantine 2015-04-03 16:44:47

+1

因爲我把你引向決議,至少你可以投入贊成票!你不覺得嗎? :) – facundofarias 2015-04-04 17:37:02

回答

0

我找到了解決我的問題。有幾個變化需要進行:

在請求的jsonData對象中,不應該有status root屬性。只是對象本身:

jsonData: { 
    id: 1, 
    description: 'Description' 
}, 

此外我從我的方法的聲明中刪除JAXBElement<Status>。它只收到一個Status status對象。

最後,Status class不需要@XmlRootElement註釋。但它需要通過默認(空)構造函數的@JsonCreator註釋。