2013-07-31 76 views
5

客戶端/瀏覽器向我的rest資源發出JSON請求(請求的內容類型爲application/json,對應的REST方法爲@Consumes("application/json")註釋)。從JAX-RS中的JSON請求獲取簡單的JSON參數

@Path("/process-something") 
@POST 
@Produces("application/json") 
@Consumes("application/json") 
@HandleDefaultExceptions 
public AResponse processSomething(List<Long>) { 

} 

的JSON體由一些簡單的類型,如List<Long>String的。

有一個簡單的可能獲得注入的JSON參數只是標註它在某種程度上,在application/x-www-form-urlencoded請求的情況下類似@FormParam? 我想用一些其他更容易的解決方案,比用傑克遜的ObjectMapper或Jettison的JSONObject解碼JSON字符串。

+0

使用JAXRS實現什麼框架是嗎?也有很多的框架存在其提供支持JSON雖然只有註釋是不夠的,你必須映射宜商但那不是什麼大不了的事。請參閱Jersey,Apache CXF – Sikorski

+0

Jersey是我使用的。我希望通過映射你並不意味着創建ObjectMapper或其他對象的實例(請參閱問題的最後部分)... –

+1

不,我的意思是你將不得不提供一個條目在web.xml或其他一些配置文件這會告訴球衣使用json支持。看到這個:https://jersey.java.net/documentation/latest/media.html#json - 這些更簡單的解決方案! – Sikorski

回答

4

您可以創建一個反映JSON對象數據模型的Java類,並使用JAXB的@XmlRootElement對其進行註釋。你可以用@XmlElement註釋的屬性,以自定義的JSON鍵名稱映射,例如:

@XmlRootElement 
public class MyJSONOject{ 
    @XmlElement(name="json-key-name") 
    public String attribute; 
} 

然後澤西可以爲你透明,瞧解碼JSON對象!

@Path("/process-something") 
@POST 
@Produces("application/json") 
@Consumes("application/json") 
public AResponse processSomething(MyJSONOject json) { 
    log.fine(json.attribute); 
} 
+1

雖然我期望一個更簡單的方法,比如獲取帶註釋的參數(請參閱我的答案),但我將其標記爲答案,因爲這仍然比用Jackson手動解碼更好。 –

1

根據this documentation,有6個基於參數的註釋用於從請求中提取參數,似乎沒有人爲JSON參數。

+0

你爲什麼寫這個答案? – Sikorski

+1

因爲這可能是答案......至少在提取JSON參數的JAX-RS標準中沒有註釋。 –

+0

你認爲@Consumes(「application/json」)的作用是什麼? – Sikorski