反序列化通过Rest在Jackson中设置

时间:2014-02-05 12:11:46

标签: java json rest jackson

第一次来这里,但很长一段时间的读者......一直在旋转我的车轮,并且很难找到一种方法来完成某些事情,使用杰克逊和眨眼去除一组被发送的物体。由于某种原因,此中的HashSet无法正确转换。这是一个例子:我有一个Object Foo,它是DAO中的一个实体。我可以实现和去除一个单独的Foo对象,其中包含Sets和List等,没问题。这是我的 Foo对象:

[{"uuid":"1","version":1,"salutation":null,"firstName":"Random1","lastName":"Dude1"},
{"uuid":"2","version":1,"salutation":null,"firstName":"Random2","lastName":"Dude2"}]

我一直在尝试做的是使用Wink和Jackson的休息服务。示例如下:

@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 annotated)。 “addFoos”方法向Bar添加了一组Foo,或者在这种情况下向lookuped栏添加foos。在这个代码中,休息服务中的foos回来了,我可以检查foos,它看起来就像json对象,但我得到一个异常“java.lang.ClassCastException:java.util.LinkedHashMap不能转换为com.model.Foo “当我尝试使用foos作为一组,即尝试迭代等。 我的问题是杰克逊可以反序列化一组作为实体的对象,还是你必须定义一个单独的对象类型,它是一组实体,只是作为杰克逊使用的地图?总而言之,杰克逊如何考虑用于反序列化的已定义对象的HashSets?因为它应该是直接的,我只是想要对集合进行反序列化并且能够在休息服务中将其作为POJO进行操作,因此难以在方向上点亮保险丝,因为它应该是直接的。

1 个答案:

答案 0 :(得分:0)

以下是我能够在杰克逊中保存已知实体集的方法。使用ObjectMapper并在每个rest服务上定义如下例:

@Resource
BarManager barManager

ObjectMapper mapper = new ObjectMapper();

@PUT
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Bar addFoosForBar(@PathParam("id") String id, String foos) {

HashSet<foos> foosSet = null;
JavaType javaType = mapper.getTypeFactory().constructParametricType(HashSet.class, Foo.class);
try {
     fooSet = mapper.readValue(foos, javaType);
} catch (IOException e) {
e.printStackTrace();
}

Bar bar = barManager.getById(id);
bar.addFoos(foos);
return barManager.update(bar);
}

不是最好的工作,但是会使用Jackson的构造函数在已知定义的类上创建集合,列表等等。希望这有助于某人。