我有一个使用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来序列化我实际返回之前返回的对象来解决这个问题。这样我实际上得到了另一个问题的堆栈跟踪。
答案 0 :(得分:2)
你可能有一个递归循环(根据DwB的评论):用户包含一个挑战列表,每个挑战包含一个用户,其中包含挑战列表等等。解析器(或整个服务器)不喜欢这样。您应该使用注释JsonManagedReference和JsonBackReference。
答案 1 :(得分:0)
您可以尝试使用flexjson(由Spring Roo使用)或gson(由Google开发)
答案 2 :(得分:0)