【问题标题】:Filling entity links in custom @RepositoryRestController methods在自定义 @RepositoryRestController 方法中填充实体链接
【发布时间】:2015-11-02 16:30:06
【问题描述】:

我正在使用 Spring-data-rest 为一些 JPA 实体提供读取 API。 对于写入,我需要发出命令对象而不是直接写入数据库,因此我使用@RepositoryRestController 和各种命令处理方法添加了一个自定义控制器:

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody MyEntity post(@RequestBody MyEntity entity) {
  String createdId = commands.sendAndWait(new MyCreateCommand(entity));
  return repo.findOne(createdId);
}

我希望像 spring-data-rest 控制器的任何其他响应一样丰富输出,特别是我希望它向自身及其关系添加 HATEOAS 链接。

【问题讨论】:

    标签: java spring jpa spring-data-rest spring-hateoas


    【解决方案1】:

    这是Oliver Gierke 本人最近提出的answered(见第 3 点。)(尽管问题使用了完全不同的关键字,所以我不会将其标记为重复)。

    单个实体的示例将变为:

    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody PersistentEntityResource post(@RequestBody MyEntity entity,
        PersistentEntityResourceAssembler resourceAssembler)) {
      String createdId = commands.sendAndWait(new MyCreateCommand(entity));
      return resourceAssembler.toResource(repo.findOne(createdId));
    }
    

    非分页列表示例:

    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody Resources<PersistentEntityResource> post(
        @RequestBody MyEntity entity,
        PersistentEntityResourceAssembler resourceAssembler)) {
      List<MyEntity> myEntities = ...
      List<> resources = myEntities
          .stream()
          .map(resourceAssembler::toResource)
          .collect(Collectors.toList());
      return new Resources<PersistentEntityResource>(resources);
    }
    

    最后,对于分页响应,应该使用注入的 PagedResourcesAssembler,传入方法注入的 ResourceAssembler 和 Page,而不是实例化 Resources。有关如何使用PersistentEntityResourceAssemblerPagedResourcesAssembler 的更多详细信息,请参阅this answer。请注意,目前这需要使用原始类型和未经检查的强制转换。

    也许有自动化的空间,欢迎更好的解决方案。

    P.S.:我还创建了一个 JIRA ticket 以将其添加到 Spring Data 的文档中。

    【讨论】:

    • 这是否是 Gierke 选项 3 的更详细示例:stackoverflow.com/a/29924387/1938607
    • 仍然缺少一些重要的部分:1) 你如何从“MyEntity”变成PersistentEntityResource。 2)针对分页集合的示例,对于单个实体,过程不同。我会自己尝试解决这些,。
    • 轻松解决了单个资源并更新了答案。在方法上注入 resourceAssembler 并为每个处理程序重复调用 toResource 仍然是违反直觉的。如果可以通过仅返回实体来自动构建资源,那就太好了。在标记为已接受之前,我会稍等片刻,看看是否有改进。
    • 既然这是 Spring Data 的首席开发人员所描述的方式,我对此表示怀疑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多