我正在使用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 manually,但我更喜欢更清晰的解决方案。
我发送的JSON在这种情况下是否有效,还是需要顶级{}
,即包装器实体?这似乎有点不自然。
谢谢,
/大卫
答案 0 :(得分:6)
我认为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}, ...]
}
答案 1 :(得分:4)
好的,所以最后我用一个简单的包装类解决了这个问题,以便生成{ items : [{ <myEnityInstanceJson1> }, { <myEnityInstanceJson2> }, ... ]}
。我想有一种方法可以使用通用wrapper,但现在可以这样做:
@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;
}
}
答案 2 :(得分:1)
问题是通用列表类型,由于类型擦除而无法在运行时使用,因此Jersey不知道要解组什么类型的POJO。
我认为在这种情况下,最简单的解决方案(我知道有效,至少在你的MessageBodyReader
中使用Jackson)将只使用普通的Java数组而不是List,因此方法签名变为:
public String createBatch(@PathParam("someParam") String someParam, MyEntity[] myEnts)
是的,合并@PathParam
和消耗/解组的身体参数应该没问题。
答案 3 :(得分:1)
包装类有效。
MyEntity[] myEnts
无效。
这就是我所做的并且有效。
public String createBatch(@PathParam("someParam") String someParam,
String content)
使用ObjectMapper
转换为对象列表。
List<MyEntity> entities = om.readValue(content,
new TypeReference<List<MyEntity>>(){}).
答案 4 :(得分:0)