12

我正在使用 Jersey 1.11 在 Java 中构建 RESTful Web 服务,并且在实现使用 JSON 化实体列表的方法时遇到问题。单实例方法工作正常。

我得到的错误是:

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 是一个MyEntityJSON 对象数组:

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

之前已经提出过类似的问题,一个直接的建议是将使用的媒体类型更改为文本并手动反序列化 JSON,但我更喜欢更清洁的解决方案。

我发送的 JSON 在这种情况下是否有效,还是我需要一个顶级的{}即包装实体?这似乎也有点不自然。

谢谢,

/大卫

4

5 回答 5

7

我认为 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}, ...]
}
于 2013-03-24T00:34:35.937 回答
4

好的,所以最后我使用一个简单的包装类解决了这个问题,以便生成{ 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;
    }
}
于 2013-04-02T22:44:54.147 回答
2

问题是通用列表类型,由于类型擦除,它在运行时不可用,所以 Jersey 不知道要解组哪种 POJO。

MessageBodyReader我认为在这种情况下,最简单的解决方案(我知道至少在您的 .

public String createBatch(@PathParam("someParam") String someParam, MyEntity[] myEnts)

是的,结合@PathParam和消耗/未编组的主体参数应该没问题。

于 2016-06-29T15:40:31.823 回答
0

这是数组的有效 JSON:

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

(见这里的例子)

您不需要发送文本,您可以将其作为 JSON 发送。您也MyEntity应该拥有@XmlRootElement它(参见此处,第 5.2 节的示例)。

您不需要PathParam在您的参数中,如果您在您的方法签名中someParam留下请求,则在发布请求时可用。@Path("/some-path/{someParam}")

于 2013-03-24T00:39:56.747 回答
0

包装类工作。 MyEntity[] myEnts不起作用。

这就是我所做的,并且奏效了。

public String createBatch(@PathParam("someParam") String someParam,
                                                  String content)

用于ObjectMapper转换为对象列表。

List<MyEntity> entities = om.readValue(content, 
                                       new TypeReference<List<MyEntity>>(){}).
于 2017-03-14T20:51:11.357 回答