簡體   English   中英

Jersey,如何POST一個JSON對象列表?

[英]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>>(){}).

這是數組的有效JSON:

{"elements": [
        {"field1" : value1, "field2" : value2}, 
        {"field1" : value3, "field2" : value4},
        ...]
};

(見這里的例子)

您不需要發送文本,可以將其作為JSON發送。 你的MyEntity應該有@XmlRootElement (參見這里 ,5.2節的例子)。

你不需要PathParam在你的論點, someParam當你離開的請求,發布可@Path("/some-path/{someParam}")在你的方法簽名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM