2

我有以下 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 数据中获得带有产品列表的 Reservation 类对象。然而,我得到的是一个只有名称和价格设置的对象。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 - Jersey 2.2

编辑: 我在 GitHub 上创建了一个非常简单的项目的存储库: Jersey22 MyResource 类中有两个带有路径的 POST 方法:/working 和 /notworking

我会很感激任何工作的例子。谢谢你。

4

3 回答 3

0

确实它应该工作......

您也可以尝试使用Genson库,将其添加到您的类路径中,它应该可以在没有任何其他配置的情况下工作。

于 2013-09-17T07:16:07.980 回答
0

最后我得到了这个工作。我认为重要的步骤是:

  • 添加 jersey-media-json-jackson maven 依赖项
  • 在创建 JAX-RS 应用程序时注册 Jackson,方法是调用: register(JacksonFeature.class);
于 2013-09-25T09:17:11.240 回答
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

所以我无法理解出了什么问题。在我的应用程序中,我使用了 Jersey 1.10 和 Jackson 1.8.3,但我想每个版本的 Jersey 和 Jackson 都可以。

如果我可以建议您进行改进,这也可以解决您的问题,我将创建一个新对象来定义“产品”;从概念上讲,它代表一个对象。也许一个更简单的List<Product>将被反序列化而没有任何问题。

于 2013-09-17T00:18:09.173 回答