当前位置: 首页 > 知识库问答 >
问题:

使用Spring HATEOAS嵌套嵌入HAL

汝昀
2023-03-14

我正在寻找HAL中嵌套_embedded如何使用Spring HATEOAS API编程的例子。最佳实践是什么?

下面是我想要实现的一个例子:

{
    "_links": {
        "self": { "href": "/invoices" }
    },
    "_embedded": {
        "invoices": [
            {
                "_links": {
                    "self": { "href": "/invoice/1" }
                },
                "_embedded": {
                    "items": [
                        { "_links": { "self": { "href": "/product/1" }}, "id": 1, "name": "Super cheap Macbook Pro", "price": 2.99 }
                    ]
                },
                "id": 1,
                "total": 2.99,
                "no_items": 1
            },
            {
                "_links": {
                    "self": { "href": "/invoice/2" }
                },
                "_embedded": {
                    "items": [
                        { "_links": { "self": { "href": "/product/2" }}, "id": 2, "name": "Raspberry Pi", "price": 34.87 },
                        { "_links": { "self": { "href": "/product/3" }}, "id": 3, "name": "Random product", "price": 30 },
                        { "_links": { "self": { "href": "/product/4" }}, "id": 4, "name": "More randomness", "price": 30 }
                    ]
                },
                "id": 2,
                "total": 94.87,
                "no_items": 3
            }
        ]
    }
}

共有1个答案

阳光辉
2023-03-14

通过Spring Data REST和Spring HATEOAS,我看到了两种轻松实现所需的方法。

  1. 创建一个发票和项目实体,并只为发票实体创建一个存储库。这将内联项目。不利的一面是,您无法对项目本身进行查询,这可能不是您想要的。
  2. 创建两个实体,并为它们创建存储库。现在在发票存储库上创建一个摘录,可以查询,并且嵌入了项目和相应的链接集合。但是也有一个缺点:嵌入的项目上没有链接。我认为你应该能够通过使用投影中的资源来包含链接。

请参阅使用带物品的订单的一些示例代码

@Data
@Entity
public class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
}

@Data
@Entity
@Table(name = "customer_order")
public class Order {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
  private Collection<Item> items;
}

public interface ItemRepository extends CrudRepository<Item, Long> {
}

@RepositoryRestResource(excerptProjection = InlineItems.class)
public interface OrderRepository extends CrudRepository<Order, Long> {
}

@Projection(name = "inlineItems", types = Order.class)
public interface InlineItems {
  String getName();

  Collection<Item> getItems();
}

您可以像这样查询订单GEThttp://localhost:8080/orders/1?projection=inlineItems,这将导致以下结果:

{
  "name": "My Order",
  "items": [
    {
      "name": "Banana"
    },
    {
      "name": "Apple"
    }
  ],
  "_links": {
    "self": {
      "href": "http://localhost:8090/api/orders/1"
    },
    "order": {
      "href": "http://localhost:8090/api/orders/1{?projection}",
      "templated": true
    },
    "items": {
      "href": "http://localhost:8090/api/orders/1/items"
    }
  }
}
 类似资料:
  • 我有一个相当典型的场景,其中有一个main@实体,他内部的所有内容都是可嵌入的(因此,没有父实体,内部的所有内容都没有意义)。现在JPA 2.0阻止我在另一个@ElementCollection中定义的@Embeddeble中嵌套一个@ElementCollection: JSR-317 2.6可嵌入类和基本类型的集合包含在元素集合中的可嵌入类(包括另一个可嵌入类中的可嵌入类)不得包含元素集合,也

  • 我被困在将嵌套JS与宇宙数据库核心SQL API集成上。我知道有一个用于 Cosmos DB 的模块(https://github.com/nestjs/azure-database),但我需要数据架构来支持嵌套的 json,如下所示: 我认为@nestjs/azure-database不支持这一点(或者我可能错了),因为当我检查他们的示例和quickstart时,没有这样的json模式的示例。

  • 我对摩基托并不陌生,但这次我在工作中发现了一个有趣的案例。我希望你能帮我解决这件事。 我需要注入mock来改变测试过程中的某些方法行为。问题是,bean结构是嵌套的,并且这个bean在其他bean内部,不能从test方法访问。我的代码如下所示: 所以在我的测试中,我希望调用nestedDAO.method返回模拟答案。 我尝试执行一个initmocks: 还要在我的测试类上添加注释: 总是从方法获

  • 问题内容: 我可以使用Golang将平面对象插入BigQuery中-如何将嵌套数据插入表中? 我的BigQuery模式如下所示(从示例中): 我的第一次插入尝试如下所示(示例): 哪个变平并插入没有问题。我只是在用visit_duration 但是,我需要遍历一个片段并添加到访问记录中。我试图建立一个 访问 对象(没有要测试的循环)并将其添加到行中,但它没有插入,并且我没有收到任何错误: - -[

  • 主要内容:Java11 嵌套类的示例,输出结果为Java 11 引入了嵌套类的概念,我们可以在类中声明一个类。这种类的嵌套允许在一个地方对要使用的类进行逻辑分组,使它们更具可读性和可维护性。嵌套类可以有四种类型 - 静态嵌套类 非静态嵌套类 本地类 匿名类 Java 11 还提供了嵌套的概念,以允许嵌套类的通信和验证。 Java11 嵌套类的示例 ApiTester.java 输出结果为  

  • 如何使用jolt转换将平面JSON转换为嵌套JSON?我对JSON和jolt是新手。 输入: 预期输出: 编辑:我想在< code>SubFunds中添加一个新字段,但是新字段不在JSON文件中,它是计算字段,我可以按原样添加示例吗 并重命名字段: