4

我有一个使用 Spring、Hibernate 的项目,并且有返回 JSON 的控制器。自然,我的模型包含列表等使用 JPA 注释来定义休眠关系,因此,例如,我有用户,其中包含他们拥有的一组挑战,同样挑战包含拥有它的用户。

不幸的是,我的 JSON 中嵌入的集合似乎有很多问题。

例如,通过这种设置(用户拥有挑战,挑战拥有所有者),我可以很好地返回挑战。我可以很好地返回一个用户。但是,当我尝试返回挑战列表时,一切都崩溃了!我从 Jmeter 测试中收到以下错误:

错误 500 服务器错误

我相信这意味着 Jackson json 解析器在设置 json 时遇到了问题。我相信这一点,因为如果我使用 @JsonIgnoreProperties({"challengesOwned"}) 那么我可以很好地返回挑战列表,因为每个单独的挑战对象不再具有嵌入其中的列表。

这对我来说似乎很奇怪。Jackson 真的不能在 JSON 中映射简单的嵌入式列表吗?我也遇到了一个大问题,因为我有一个使用 User 作为其键的 Map ...而且似乎根本不可能将 JSON 映射的键定义为嵌入式对象!

有人对我的问题有建议吗?我是否必须手动定义一些 Json 映射?有没有我不知道的简单解决方案?

编辑:

虽然 j0ntech 所说的似乎是真的,但事实证明这并不是故事的全部。似乎当 Spring 使用 Jackson 将我的一个休眠实体序列化为它的 JSON 版本时,休眠试图延迟加载该实体的属性之一,但由于该实体当时不在其事务中(“在”控制器中) ),它导致了一个异常,它刚刚被吞没了。

所以实际上有两个问题。我通过尝试手动使用 Jackson 在实际返回它之前序列化我返回的对象来解决这个问题。这样我实际上得到了另一个问题的堆栈跟踪。

4

3 回答 3

2

您可能有一个递归循环(根据 DwB 的评论):用户包含一个挑战列表,每个挑战都包含一个用户,其中包含一个挑战列表等等。解析器(或您的整个服务器)不喜欢这样。您应该使用注释JsonManagedReferenceJsonBackReference

您可以在此处此处阅读有关如何使用这些注释的信息。我在自己的一些项目中使用过它们,如果正确实施,它们会很好地工作。

于 2013-01-28T20:26:41.433 回答
0

您可以尝试使用 flexjson(由 Spring Roo 使用)或 gson(由 google 开发)

于 2013-01-28T19:47:01.170 回答
0

用列表解析 GSON 似乎很简单

http://risabhsays.wordpress.com/2011/02/24/parsing-list-of-json-objects-with-gson/

于 2013-01-28T20:50:08.177 回答