gpt4 book ai didi

java - 将jpa实体转换为restful资源的好策略是什么

转载 作者:IT老高 更新时间:2023-10-28 21:18:50 24 4
gpt4 key购买 nike

Restful 资源并不总是与您的 jpa 实体具有一对一的映射关系。正如我所看到的,我正在尝试解决一些问题:

  1. 当资源包含由多个实体填充和保存的信息时。
  2. 当一个实体中包含更多您想作为资源发送的信息时。我可以只使用 Jackson 的 @JsonIgnore,但我仍然会遇到问题 1、3 和 4。
  3. 当一个实体(如聚合根)具有嵌套实体,并且您希望将其嵌套实体的一部分包含在内,但仅限于一定级别的嵌套作为您的资源。
  4. 当您想要排除一个实体的一部分时,它是一个父实体的一部分,但当它是另一个父实体的一部分时排除一个单独的部分。
  5. 爆破的循环引用(我主要使用 jackson 的 @JsonIdentityInfo 处理 JSOG)

可能的解决方案:我能想到的处理所有这些问题的唯一方法是创建一大堆“资源”类,这些类将具有构造函数,这些构造函数采用所需的实体来构造资源并为该资源放置必要的 getter 和 setter。 .这是矫枉过正吗?

要解决 2、3、4 和 5,我可以在将实际实体发送到 Jackson 以将我的 pojo 序列化或反序列化为 JSON 之前对实际实体进行一些预处理和后处理,但这并不能解决问题 1。

这些都是我认为其他人会遇到的问题,我很好奇其他人会提出什么解决方案。 (我目前正在使用 JPA 2、Spring MVC、Jackson 和 Spring-Data,但对其他技术开放)

最佳答案

结合使用 JAX_RS 1.1 和 Jackson/GSON,您可以将 JPA 实体直接公开为 REST 资源,但您会遇到很多问题。

DTO,即投影到 JPA 实体上是可行的方法。它将允许您将 REST 的资源表示关注点与 JPA 的事务关注点分开。您可以明确定义表示的性质。如果您仔细设计 DTO/投影,您可以控制表示中出现的数据量,包括要遍历的对象图的深度。您可能需要为同一 JPA 实体创建多个 DTO/投影,以用于不同的资源,实体可能需要以不同的方式表示。

此外,根据我在 JPA 实体上使用 @JsonIgnore@JsonIdentityInfo 等注释的经验,并不能完全提供更多可用的资源表示。在将对象合并回持久化上下文时,您最终可能会遇到麻烦(因为忽略了属性),或者您的客户端可能无法使用资源表示,因为对象引用作为一种方案可能不被理解。由于此处缺乏标准化,大多数 JavaScript 客户端通常无法使用 @JsonidentityInfo 注释生成的对象引用。

还有其他方面可以通过 DTO/投影实现。 JPA @EmbeddedId 不适合 REST 资源表示。一些人提倡使用 JAX-RS @MatrixParam 注释在资源 URI 中唯一地标识资源,但这对于大多数客户端来说并不是开箱即用的。矩阵参数毕竟只是设计说明,而不是标准(还)。使用 DTO/投影,您可以根据计算的 Id(可能是组成键的组合)提供资源表示。

注意:我目前正在开发用于 REST 的 JBoss Forge 插件,其中部分或全部存在这些问题,并将在未来的某个版本中通过生成 DTO 得到修复。

关于java - 将jpa实体转换为restful资源的好策略是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17874688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com