【问题标题】:Best workaround for Spring MVC Json parsing limitationsSpring MVC Json 解析限制的最佳解决方法
【发布时间】:2013-01-28 19:35:49
【问题描述】:

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

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

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

错误 500 服务器错误

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

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

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

编辑:

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

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

【问题讨论】:

  • 只是猜测,但 JSON 解析器可能不喜欢递归循环。您的递归循环是用户 -> 挑战 -> 用户 -> 挑战 ... 到无穷大和超越

标签: java json spring spring-mvc


【解决方案1】:

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

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

【讨论】:

  • 嘿,这听起来可能会解决我的问题。我去看看!
  • 我发现了一个额外的问题。你说的一切都是正确的,但对我来说这不是全部。我将我的发现添加到问题中。
【解决方案2】:

你可以试试 flexjson(Spring Roo 使用)或 gson(google 开发)

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2021-04-07
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多