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

如何在子资源中添加HATEOAS链接

皇甫鸿远
2023-03-14

我有一个名为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
}

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

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

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());
}

谢谢!

斯蒂芬

共有1个答案

墨宜人
2023-03-14

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

在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));
 类似资料:
  • 在Eclipse中,我可以将一个源文件夹作为“链接源文件夹”添加到我的android项目中。我如何在Android Studio实现同样的事情呢? 或者是否可以添加一个外部文件夹来构建Gradle?

  • 我正在使用IntelliJ IDEA14,我想在src之外向JAR文件添加文件。这是我目前的项目结构。 我想将layout.txt和saveddata.txt添加到JAR文件可执行文件中。我在网上搜索了一段时间也找不到解决方法 以防你需要看我的代码。这就是我读取文件的方式 这是我的项目结构

  • 我正在使用配置了@EnableHypermediaSupport(类型=HAL)的Spring Boot和Spring Hateoas。虽然这在基本场景中效果很好,但我希望能够向链接添加其他属性。例如,很容易返回将呈现以下链接的链接: 我想做的是向something rel中的对象添加更多属性。例如: 在不创建自己的DTO的情况下,最好的方法是什么(最好使用ControlllerLinkBuild

  • 我正在使用Dropwizard 8.2.0构建REST服务。我有2个资源:FolderResource和FileResource: 我做错了什么?

  • 在Eclipse中,我可以将一个源文件夹作为“链接源文件夹”添加到我的Android项目中。如何在Android Studio中实现同样的效果? 或者是否可以在Gradle中添加外部文件夹?