有条件地序列化收集领域的最佳实践?

时间:2014-11-22 14:39:56

标签: java json jersey jackson

我已经解决了我的问题,我稍后会对此进行描述,但我不喜欢这就是我问的原因。

我使用最新的球衣和杰克逊图书馆。我有一个实体的休息服务,到目前为止,我有2个获取方法:getById和getList,两者都使用jackson返回json。实体使用OneToMany关系引用自身,因此它是一组实体。对于getList,我不希望该字段被序列化,而对于getById,我希望它以自己的方式被序列化。

我的解决方案是:

对于getList,我在字段上使用视图 在实体bean中,我使用了我的JsonView类FirstLevelOfCollection:

@JsonView(JacksonViews.FirstLevelOfCollection.class)

在rest service getList方法中,我使用Object作为视图过滤器,因此所有包含@JsonView的字段都将被包含在内:

ObjectMapper mapper = new ObjectMapper();
resultString = mapper.writerWithView(Object.class).writeValueAsString(resultObject);

对于getById,我使用自定义序列化

ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null, null, null));
testModule.addSerializer(Set.class, new EndEventCodesSerializer(Set.class));
mapper.registerModule(testModule);
resultString  = mapper.writeValueAsString(resultObject);

我无法使用@JsonIgnore视图,因为自定义序列化也不会看到它。它可以工作,但它似乎奇怪和丑陋,特别是排除这样的领域,我也想实现,但我不知道如何默认使用排除(getList行为)所有未来的请求。我可以有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我接受了Adam Gent的建议。 我把@JsonIgnore放在所有引用字段上,实现了几个DTO,它们只是我的实体类的包装器,我用这些DTO响应休息服务。