【问题标题】:What's the best way to implement update deeply nested JSON structure with Spring Data REST?使用 Spring Data REST 实现更新深度嵌套 JSON 结构的最佳方法是什么?
【发布时间】:2017-12-06 12:20:59
【问题描述】:

我有许多相关资源,在后端(Spring Data REST)上有导出的存储库。 我的客户端使用 GET 加载“根”资源,然后通过“_links”属性延迟加载相关资源。 然后客户端可以修改加载的graph中的一些资源。

我想实现服务,它将使用所有延迟加载资源的 json 并立即通过版本检查(乐观)更新修改的资源。

实现这一点的最佳方法是什么? 这种方法是不好的做法吗?

【问题讨论】:

  • 听起来是graphql.com的好地方
  • 听起来是一个不错的方法,但看看你如何实现它会很有趣。如果缺少某些配置,可以发送 JVM 进行折腾,请确保为实用程序实现单例设计模式
  • “不要那样做”怎么样? JSON 是数据结构的表示,而不是数据结构本身。使用适当的抽象和封装。仅在 I/O 上与 JSON 相互转换。
  • @Raedwald,对不起,我不明白你的建议。如我所见,客户端总是向服务器传输数据结构的一些“表示”。然后服务器应该转换并持久化它。为什么客户端不能传输到服务器嵌套的 json 作为修改数据的表示?
  • @StanislavL,您可以将您的评论复制到答案中吗?我认为它应该被接受为我的问题的答案。

标签: java json spring rest spring-data-rest


【解决方案1】:

我没有完全理解你的意思,但如果你想在 SDR 中“急切”地加载嵌套资源,你可以关闭相关“嵌套”存储库的导出(甚至完全删除它们)。例如:

@Entity
public class Parent {
   //...
   @OneToMany(cascaded = ALL, orphanRemoval = true)
   private Set<Child> children;
}

@Entity
public class Child {
   //...
}

@RepositoryRestResource
public interface ParentRepo extends JpaRepository<Parent, Long> {}

@RepositoryRestResource(exported = false)
public interface ChildRepo extends JpaRepository<Child, Long> {}

您还可以将cascade = ALL, orphanRemoval = true 参数添加到OneToMany 注释。

那么你所有的子对象都将由 Parent 对象管理,公共的有效载荷将如下所示:

{
   "name": "parent1",
   "children": [
      {
         "name": "child1"
      },

      {
         "name": "child2"
      }
   ]
}

【讨论】:

  • 感谢您的回答!我认为,我需要混合行为:客户端延迟加载资源,但使用一个请求更新它们。我可以在写入时将资源设为“exported=true”,在读取时设为“exported=false”吗?
  • 不要忘记接受/支持对您有帮助的答案... ;)
  • 我接受您在其他问题中的回答,但这个问题对我来说仍然不清楚。我想要“导出”资源(客户端延迟加载它们),但我需要像“事务”这样的东西来一起“提交”修改后的资源。
  • @Aleksandr 只需根据我的示例创建有效负载并发布它。所有这些对象将在一个事务中一起持久化。 (别忘了设置cascade = ALL...)
  • 我已经做了类似的配置(使用@RestResource(exported = false))。但问题是,通过这种方法,我总是得到所有嵌套对象。我可以单独获取资源,但通过一个请求编写它们吗?
【解决方案2】:

听起来是graphql.com 的好地方

它允许在一个请求中获取您需要的所有数据。您可以定义 API 并调用仅请求必要部分数据的查询。

它也支持自定义更新。

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 2010-10-12
    • 1970-01-01
    • 2014-01-23
    • 2019-03-15
    • 1970-01-01
    • 2019-01-30
    • 2023-03-27
    相关资源
    最近更新 更多