我使用泽西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,也应当由新泽西州(JAX-RS)解组一个参数是不可能的。 请尝试删除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;
}
}
问题是泛型列表类型,它是不可用,由于类型擦除运行,所以不会泽西知道什么样的POJO的解组。
我认为,最简单的解决办法(我知道的作品,在你用杰克逊至少在MessageBodyReader
)在这种情况下是只使用普通的Java数组代替列表,因此该方法的签名变成了:
public String createBatch(@PathParam("someParam") String someParam, MyEntity[] myEnts)
是的,结合@PathParam
和消费/解组身体参数应该罚款。
包装类的工作。 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}")
在你的方法签名。