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

标签 java json spring spring-mvc

我有一个使用 Spring、Hibernate 和返回 JSON 的 Controller 的项目。当然,我的模型包含列表等,以使用 JPA 注释来定义 hibernate 关系,因此,例如,我有用户,其中包含他们拥有的一组挑战,同样,挑战包含拥有它的用户。

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

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

错误 500 服务器错误

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

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

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

编辑:

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

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

最佳答案

您可能有一个递归循环(根据 DwB 的评论):用户包含一个挑战列表,每个挑战都包含一个用户,用户又包含一个挑战列表,依此类推。解析器(或您的服务器)不喜欢那样。您应该使用注释 JsonManagedReferenceJsonBackReference .

您可以阅读有关如何使用这些注释的信息 herehere .我在我自己的一些项目中使用过它们,如果实现得当,它们会非常有效。

关于java - Spring MVC Json 解析限制的最佳解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14569767/

相关文章:

java - WordPress 和 GWT

java - 为什么内部类方法隐藏所有同名的封闭类方法?

框架 4.5 中的 c# ReadAsJsonAsync

java - @Transactional 使 getClass 在类上返回 com.sun.proxy.$Proxy

java - 是否可以在 spring boot 中创建一个通用的 CRUD

java - 2 人掷硬币

java - 无法写入 Android 上的外部存储

json - 休息 HATEOAS : How to determine and set media-type while browsing links?

javascript - 使用 jQuery 迭代 JSON 对象数组时出现奇怪的行为

java - Rail 的 'Gotchas' 和学习曲线 - 它会停止吗?