복붙노트

[SPRING] 하위 리소스에 HATEOAS 링크를 추가하는 방법

SPRING

하위 리소스에 HATEOAS 링크를 추가하는 방법

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

감사 !

스테판

해결법

  1. ==============================

    1.이 질문은 비록 꽤 오래되었지만 유사한 기능을 구현하는 사람들에게 응답할만한 가치가있을 수 있습니다. 기본적으로 AdminResource에 AdminModuleResource에 대한 임베디드 리소스를 만들고 AdminResourceAssembler 내에서 이러한 임베디드 리소스에 대한 링크를 빌드합니다. 아래의 코드는이 답변에 게시 된 내용의 단순화 된 버전입니다.

    이 질문은 비록 꽤 오래되었지만 유사한 기능을 구현하는 사람들에게 응답할만한 가치가있을 수 있습니다. 기본적으로 AdminResource에 AdminModuleResource에 대한 임베디드 리소스를 만들고 AdminResourceAssembler 내에서 이러한 임베디드 리소스에 대한 링크를 빌드합니다. 아래의 코드는이 답변에 게시 된 내용의 단순화 된 버전입니다.

    그는 adminresource 추가 :

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

    Admin Resource Assembler에서 다음을 추가하십시오.

    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));
    
  2. from https://stackoverflow.com/questions/25602402/how-to-add-hateoas-links-in-a-sub-resource by cc-by-sa and MIT license