![](/img/trans.png)
[英]How do you POST a json list of objects using the jersey REST Webtarget API? - getting error MessageBodyWriter not found
[英]Jersey, how to POST a list of JSON objects?
我正在使用Jersey 1.11在Java中構建RESTful Web服務,並且在實現消耗JSON-ised實體列表的方法時遇到問題。 單實例方法工作正常。
我得到的錯誤是:
Status 400 - Bad Request. The request sent by the client was syntactically incorrect.
我的方法簽名如下所示:
@POST
@Path("/some-path/{someParam}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String createBatch(List<MyEntity> myEnts, @PathParam("someParam") String someParam)
{
...
}
我在請求中發送的JSON是MyEntity
JSON對象的數組:
[{"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]
之前已經提出了類似的問題,一個直接的建議是將消費的媒體類型更改為文本並手動反序列化JSON,但我更喜歡更清潔的解決方案。
我發送的JSON在這種情況下是否有效,或者我是否需要頂層{}
即包裝器實體? 這似乎有點不自然。
謝謝,
/大衛
我認為PathParam以及一個應該由Jersey(JAX-RS)解組的Param是不可能的。 請嘗試刪除PathParam參數。
如果你需要第二個參數,那么創建一個這樣的新類
@XmlRootElement(name = "example")
public class Example {
@XmlElement(name = "param")
private String param;
@XmlElement(name = "entities")
private List<MyEntity> entities;
}
並修改您的Methode:
@POST
@Path("/some-path")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String createBatch(Example example)
{
...
}
你的JSON應該是這樣的:
{
"param":"someParam",
"entities":[
{"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]
}
好的,所以最后我用一個簡單的包裝類來解決這個問題,以生成{ items : [{ <myEnityInstanceJson1> }, { <myEnityInstanceJson2> }, ... ]}
。 我想有一種方法可以使用通用包裝器,但現在這樣做:
@XmlRootElement
public class MyEntityWrapper implements Serializable {
private static final long serialVersionUID = 1L;
private List<MyEntity> items;
public MyEntityWrapper() {
this.items = new ArrayList<MyEntity>();
}
public MyEntityWrapper(List<MyEntity> items) {
this.items = items;
}
public List<MyEntity> getItems() {
return items;
}
public void setItems(List<MyEntity> items) {
this.items = items;
}
}
問題是通用列表類型,由於類型擦除而無法在運行時使用,因此Jersey不知道要解組什么類型的POJO。
我認為在這種情況下,最簡單的解決方案(我知道可行,至少在你的MessageBodyReader
使用Jackson)將只使用普通的Java數組而不是List,因此方法簽名變為:
public String createBatch(@PathParam("someParam") String someParam, MyEntity[] myEnts)
是的,組合@PathParam
和消耗/解組的body參數應該沒問題。
包裝類工作。 MyEntity[] myEnts
不起作用。
這就是我所做的並且有效。
public String createBatch(@PathParam("someParam") String someParam,
String content)
使用ObjectMapper
轉換為對象列表。
List<MyEntity> entities = om.readValue(content,
new TypeReference<List<MyEntity>>(){}).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.