【发布时间】:2014-02-05 12:11:46
【问题描述】:
第一次来这里,但长期阅读...一直在旋转我的轮子,并且很难找到一种方法来完成某些事情,使用 Jackson 和 Wink 对一组发送过来的对象进行去耳化。由于某种原因,其中的 HashSet 无法正确转换。这是一个示例:我有一个对象 Foo,它是 DAO 中的一个实体。我可以对包含 Sets 和 List 等的单个 Foo 对象进行序列化和反序列化,没问题。这是我的 Foo 对象:
[{"uuid":"1","version":1,"salutation":null,"firstName":"Random1","lastName":"Dude1"},
{"uuid":"2","version":1,"salutation":null,"firstName":"Random2","lastName":"Dude2"}]
我一直在尝试在使用 Wink 和 Jackson 的 Rest 服务中执行此操作。示例如下:
@Resource
BarManager barManager
@PUT
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Bar addFoosForBar(@PathParam("id") String id, Set<Foo> foos) {
Bar bar = barManager.getById(id);
bar.addFoos(foos);
return barManager.update(bar);
}
这是示例代码,barManager.getById(id) 是检索 Bar 对象的查找资源(@Resource 注释)。 “addFoos”方法将一组 Foo 添加到 Bar,或者在这种情况下将 foos 添加到查找的 bar。在这段代码中,其余服务中的 foos 回来了,我可以检查 foos,它看起来与 json 对象完全一样,但我得到一个异常“java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.model.Foo ” 当我尝试将 foos 作为一个集合使用时,即尝试迭代等。 我的问题是杰克逊可以反序列化一组作为实体的对象,还是你必须定义一个单独的对象类型,它是一组实体,只是专门作为杰克逊使用的地图?综上所述,Jackson 是如何考虑已定义对象的 HashSet 进行反序列化的?无法在一个方向上点燃导火索,因为它应该是直截了当的,我只想反序列化该集合并能够在其余服务中将其作为 POJO 进行操作。
【问题讨论】:
-
你期待什么?应该如何调用您的示例函数?指定输入格式,例如给出示例 JSON 请求。
-
对此休息服务添加了一些说明,但只是希望用一组 foo 更新栏来回答您的第一个问题。在这种情况下,@Path("{id]") 通过 URL 调用它是一个休息服务。输入格式在客户端发送的有效负载中。如果我在 JVM 中检查 foos,它看起来与上面的 JSON 对象完全一样。