我有一个名为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());
}
谢谢!
的Stephane
答案 0 :(得分:0)
偶然发现这个问题,即使它已经很老了,但对于其他实现类似功能的人来说可能值得回答。基本上,您在 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));