Spring MVC Json解析限制的最佳解决方法

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

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

例如,通过该设置(用户拥有挑战并且挑战拥有所有者),我可以很好地返回挑战。 我可以回复用户就好了。 但是,当我尝试返回一系列挑战时,一切都会爆炸! 我从Jmeter测试中收到以下错误:

错误500服务器错误

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

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

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

编辑:

虽然j0ntech所说的确如此,但事实certificate并非整个故事。 似乎当Spring使用Jackson将我的一个hibernate实体序列化为它的JSON版本时,hibernate试图延迟加载该实体的一个属性,但由于该实体在该点处处于其事务之外(在“控制器中”) ),它引起了一个例外,它被吞没了。

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

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

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

你可以尝试flexjson(由Spring Roo使用)或gson(由谷歌开发)