我关注了POJO:
public class Reservation {
private String name;
private BigDecimal price;
private ArrayList<HashMap<String, Object>> products;
...getters & setters for all fields....
}
和这个简单的Java Jersey REST资源:
@POST
@Consumes({MediaType.APPLICATION_JSON})
public String insert(Reservation re) {
//do something here with ReservationEntity
}
当我使用以下数据执行POST请求时:
{
"name":"michal",
"price":1234.3,
"products":[
{"id":1, "desc":"qwerty"},
{"id":2, "desc":"ytrewq"}
]
}
我希望从JSON数据中获取具有产品列表的类的对象。 我得到的是一个只有名称和价格设定的对象。 ArrayList产品是空的。
我尝试使用org.codehaus.jackson.map.ObjectMapper反序列化JSON数据,如下所示:
String data = "{\"name\":\"micha\".....}";
ObjectMapper om = new ObjectMapper();
Reservation re = om.readValue(data, Reservation.class);
在此之后,对象在ArrayList产品中有两个条目(HashMaps),如预期的那样。我不喜欢以这种方式使用对象映射器所以我问,如何只使用Jersey。我已经阅读了很多关于这个问题的文章,他们中的大多数建议像这样放入web.xml:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value>
</init-param>
这对我也没有用。我的web.xml中甚至没有任何声明
我正在使用: - Glassfish 4.0 - 泽西岛2.2
修改 我在GitHub上创建了一个非常简单的项目库: Jersey22 MyResource类中有两个带有路径的POST方法:/ working和/ notworking
我很欣赏任何有效的例子。谢谢。
答案 0 :(得分:0)
我已经在我的旧应用程序中尝试了您的代码,我没有遇到任何问题:整个对象正在被反序列化而没有任何问题:
@POST
@Consumes( { MediaType.APPLICATION_JSON } )
public void getServices(Reservation reservation) {
System.out.println(reservation.getName());
System.out.println(reservation.getPrice());
ArrayList<HashMap<String, Object>> products = reservation.getProducts();
for(HashMap<String, Object> product : products) {
System.out.println("Product:");
for(Entry<String, Object> e : product.entrySet()) {
System.out.println(e.getKey() + " - " + e.getValue().toString());
}
}
}
结果:
michal
1234.3
Product:
id - 1
desc - qwerty
Product:
id - 2
desc - ytrewq
所以我无法理解出了什么问题。在我的应用程序中,我使用了泽西岛1.10和杰克逊1.8.3,但我想这对泽西和杰克逊的每个版本都没问题。
如果我可以建议你改进,也可以解决你的问题,我会创建一个新的对象来定义“产品”;从概念上讲,它代表了一个对象也许更简单的List<Product>
将被反序列化而没有任何问题。
答案 1 :(得分:0)
确实它应该有用......
您也可以尝试使用Genson库,将其添加到类路径中,它应该可以在没有任何其他配置的情况下运行。
答案 2 :(得分:0)
最后我有这个工作。我认为重要的步骤是: