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

时间:2013-01-28 19:35:49

标签: java json spring spring-mvc

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

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

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

错误500服务器错误

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

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

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

编辑:

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)