【问题标题】:How to add HATEOAS links in a sub resource如何在子资源中添加 HATEOAS 链接
【发布时间】:2014-10-25 11:30:58
【问题描述】:

我有一个名为 AdminResource 的父资源和一个名为 AdminModuleResource 的子资源。

父资源正确安装了 HATEOAS 链接:

{
  "firstname" : "Stephane",
  "lastname" : "Eybert",
  "email" : "mittiprovence@yahoo.se",
  "password" : "e41de4c55873f9c000f4cdaac6efd3aa",
  "passwordSalt" : "7bc7bf5f94fef7c7106afe5c3a40a2",
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost/admins/3683"
  }, {
    "rel" : "modules",
    "href" : "http://localhost/admins/3683/modules"
  } ],
  "id" : 3683
}

孩子的资源也正确安装了 HATEOAS 链接:

{
  "module" : "BTS",
  "adminResource" : {
    "firstname" : "Stephane",
    "lastname" : "Eybert",
    "email" : "mittiprovence@yahoo.se",
    "password" : "e41de4c55873f9c000f4cdaac6efd3aa",
    "passwordSalt" : "7bc7bf5f94fef7c7106afe5c3a40a2",
    "links" : [ ],
    "id" : 3683
  },
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost/modules"
  } ],
  "id" : 1087
}

但是它的父资源已经失去了它的链接。

目前,在我的子管理模块资源中,父管理资源没有链接。事实上,汇编器的 toResource 方法只提供了子管理模块资源的链接。

public AdminModuleResource toResource(AdminModule adminModule) {
    AdminModuleResource adminModuleResource = new AdminModuleResource();
    adminModuleResource.fromAdminModule(adminModule);
    adminModuleResource.add(linkTo(AdminModuleController.class).slash(adminModuleResource.getId()).withSelfRel());
    return adminModuleResource;
}

public AdminResource toResource(Admin admin) {
    AdminResource adminResource = createResourceWithId(admin.getId(), admin);
    adminResource.fromAdmin(admin);
    adminResource.add(linkTo(AdminController.class).slash(admin.getId()).slash(UriMappingConstants.MODULES).withRel(UriMappingConstants.MODULES));
    return adminResource;
}

知道如何将链接添加到父管理资源,即使在子管理模块资源中?

编辑:这是我构建资源的方式:

public void fromAdminModule(AdminModule adminModule) {
    this.setResourceId(adminModule.getId());
    this.setModule(adminModule.getModule());
    AdminResource adminResource = new AdminResource();
    adminResource.fromAdmin(adminModule.getAdmin());
    this.adminResource = adminResource;
}

public void fromAdmin(Admin admin) {
    this.setResourceId(admin.getId());
    this.setFirstname(admin.getFirstname());
    this.setLastname(admin.getLastname());
    this.setEmail(admin.getEmail().toString());
    this.setPassword(admin.getPassword());
}

谢谢!

斯蒂芬

【问题讨论】:

  • 你是如何构建 AdminModule 的?
  • @ChrisDaMour 我在问题中添加了构建器作为编辑。
  • 我已经阅读了您的博客教程,请考虑创建一个 JIRA 问题来询问您的要求的改进。

标签: spring rest hateoas


【解决方案1】:

只是偶然发现了这个问题,尽管它已经很老了,但对于其他实现类似功能的人来说可能值得回答。基本上,您在 AdminResource 上为 AdminModuleResource 创建嵌入式资源,并在 AdminResourceAssembler 中为这些嵌入式资源构建链接。下面的代码是这个answer上发布的内容的简化版

AdminResource上添加:

@JsonUnwrapped
private Resources<EmbeddedWrapper> embeddeds;
// + setters/getters

AdminResourceAssembler上添加:

EmbeddedWrappers wrapper = new EmbeddedWrappers(true);

List<EmbeddedWrapper> wrappers = (List<EmbeddedWrapper>) super.buildEmbeddables(entity);
Set<AdminModuleResource> moduleResources = adminResource.getModuleResources( );
if(!moduleResources.isEmpty( ))
    wrappers.add(wrapper.wrap(adminModuleResourceAssembler.toResources(moduleResources)));

adminResource.setEmbeddeds(new Resources<>(wrappers));

【讨论】:

  • 我现在明白 HATEOAS 默认情况下不是级联的。并且它需要触摸父资源类型以适应子链接的集合。我对为此目的触及资源类型并不感到兴奋。我将跳过在父资源中添加子链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2019-01-03
  • 2021-07-17
相关资源
最近更新 更多