Spring Boot资源作为链接

时间:2018-10-17 20:26:04

标签: spring rest api spring-boot

我是Spring Boot的新手,我用它来实现rest API。我有一个自引用表,其中每个项目都有一个父树结构-。我已经使用ManyToOne实现了这一点,并且得到了一个拥有父对象的json对象。如果我得到所有物品,由于存在巨大的网络延迟和处理能力,因此速度非常慢,因为我的树最多可以容纳10000个物品。

我该如何使用链接来表示这一点,即json对象包含指向父级的链接和指向子级的链接的数组。我已经读过DTO可以用来实现这一点,但是我没有找到完整的细节。

我的代码的一部分

 @Entity
    @Table(name = "Item", schema = "dbo")
    @Getter
    @Setter
    public class Item {
        @Id
        @GeneratedValue
        @Column()
        private Integer ItemID;
        @Column()
        private String Project;
        @Column()
        private String Name;
        @Column()
        private Integer Version; 
    @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "ParentItemID", insertable = false, updatable = false)
        private Item parentItem;

My controller is strait forward 

@Autowired
    ItemService ItemService;
    @RequestMapping ("/items")
    public Iterable<Item> items(@RequestParam(value = "page", defaultValue = "0") Integer page,
            @RequestParam(value = "size", defaultValue = "20") Integer size, Authentication auth) {
        return ItemService.findPaginated(page, size);
    }

如果我对如何使用DTO或其他设计获得链接而不是完整对象有更多解释,我将感到高兴。

1 个答案:

答案 0 :(得分:0)

最简单的方法是,返回父级和子级ID而不是Item对象。

@Entity
    @Table(name = "Item", schema = "dbo")
    public class Item {
       .
       .  
       private Integer ItemID;
       private Integer parentItem;
       .
       . 

在控制器中具有另一个端点,例如/items/{itemId}

@GetMapping("/items/{itemId}")
public Item item(@PathVariable itemId, Authentication auth) {
  return ItemService.findById(itemId);

让您的消费者获取父/子ID并进行单独的REST调用


或者,您可以使用Spring-HATEOAS

  

Spring HATEOAS项目是一个API库,我们可以使用它来   轻松创建遵循以下原则的REST表示   HATEOAS(作为应用程序状态引擎的超文本)。

     

一般而言,该原则意味着API应该指导   客户通过返回相关的应用程序   有关接下来可能采取的步骤的信息以及每个响应。

更多信息Here