我有一个使用
Spring,Hibernate的项目,并且有一个返回
JSON的控制器.当然,我的模型包含使用JPA注释定义hibernate关系的列表,因此,例如,我有Users,它们包含一组他们拥有的Challenge,同样Challenge包含拥有它的用户.
不幸的是,我的JSON中嵌入的集合似乎有很多问题.
例如,通过该设置(用户拥有挑战并且挑战拥有所有者),我可以很好地返回挑战.我可以回复用户就好了.但是当我尝试返回一系列挑战时,一切都会爆炸!我从Jmeter测试中收到以下错误:
错误500服务器错误
我相信这意味着Jackson json解析器在设置json时遇到了问题.我相信这一点,因为如果我使用@JsonIgnoreProperties({“challengeOwned”}),那么我可以很好地返回挑战列表,因为每个单独的挑战对象不再嵌入其中的列表.
这对我来说似乎很奇怪.杰克逊真的不能在JSON中映射简单的嵌入式列表吗?我也遇到了一个很大的问题,因为我有一个使用User作为其键的Map …而且似乎甚至不可能将JSON map的键定义为嵌入对象!
有没有人对我的问题有任何建议?我是否必须手动定义一些Json映射?有一个我不知道的简单解决方案吗?
编辑:
虽然j0ntech所说的确如此,但事实证明并非整个故事.似乎当Spring使用Jackson将我的一个hibernate实体序列化为它的JSON版本时,hibernate试图延迟加载该实体的一个属性,但由于该实体在该点处处于其事务之外(在“控制器中”) ),它引起了一个例外,它被吞没了.
实际上有两个问题.我想通过尝试手动使用Jackson来序列化我实际返回之前返回的对象来解决这个问题.这样我实际上得到了另一个问题的堆栈跟踪.
最佳答案 您可能有一个递归循环(根据DwB的评论):用户包含一个挑战列表,每个挑战包含一个用户,其中包含挑战列表等等.解析器(或整个服务器)不喜欢这样.您应该使用注释
JsonManagedReference和
JsonBackReference.
您可以阅读有关如何使用这些注释here和here的内容.我已经在我自己的一些项目中使用它们,如果正确实现它们的效果非常好.