2017-02-17 46 views
1

一個人如何配置Spring數據休息連載相關實體直接彈簧安置數據序列,一個協會評爲相關實體

我希望它看起來像這樣:請注意,「所有者」鏈接是「帳戶」實體。

{ 
    "name" : "customer", 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8081/api/v1/servers/1005" 
    }, 
    "owner" : { 
     "href" : "http://localhost:8081/api/v1/account/100" 
    } 
    } 
} 

當前(默認)具有間接序列化的相關實體(aka,association)。

我不希望它看起來像這樣:「所有者」鏈接是通過自服務器實體。

{ 
    "name" : "customer", 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8081/api/v1/servers/1005" 
    }, 
    "owner" : { 
     "href" : "http://localhost:8081/api/v1/servers/1005/owner" 
    } 
    } 
} 

我已檢查文檔,找不到要去的「直接」路線任何提及。

+1

你怎麼生成的鏈接,你是什麼意思與*默認*? – linqu

+0

使用Spring Boot和@RepositoryRestController註釋。 – sofend

回答

1

解決了hackage。

步驟:

  1. 添加@RestResource(exported = false)對實體的關聯。
  2. 註冊一個ResourceProcessor<Resource<OwnedEntity>>@Bean(OwnedEntity是有所有者實體我的基類),並改變在該方法鏈接集合。

詳情請見Customizing the JSON output section of the Spring Data REST reference docs

按要求,這裏的一些代碼,這是否:

/* 
* Copyright (c) 2017. DataVolo, Inc. All Rights Reserved. 
*/ 

package com.datavolo.tenant.web; 

import com.datavolo.tenant.domain.Account; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.rest.webmvc.support.RepositoryEntityLinks; 
import org.springframework.hateoas.Link; 
import org.springframework.hateoas.mvc.ResourceAssemblerSupport; 
import org.springframework.stereotype.Component; 

import javax.annotation.Nonnull; 

/** 
* 
*/ 
@Component 
public class AccountResourceAssembler extends ResourceAssemblerSupport<Account, AccountResource> { 

    private final RepositoryEntityLinks repositoryEntityLinks; 

    @Autowired 
    public AccountResourceAssembler(@Nonnull RepositoryEntityLinks repositoryEntityLinks) { 
     super(AccountController.class, AccountResource.class); 
     this.repositoryEntityLinks = repositoryEntityLinks; 
    } 

    @Override 
    public AccountResource toResource(Account entity) { 
     Link accountLink = repositoryEntityLinks.linkToSingleResource(Account.class, entity.getId()); 
     String accountHref = accountLink.getHref(); 
     Link selfLink = new Link(accountHref, Link.REL_SELF); 

     Link subAccounts = new Link(accountHref + "/subAccounts", "subAccounts"); 
     Link owner = new Link(accountHref + "/owner", "owner"); 

     Account parent = entity.getParent(); 
     Link[] links; 
     if (parent == null) { 
      links = new Link[] {selfLink, accountLink, subAccounts, owner}; 
     } else { 
      Link parentAccountLink = repositoryEntityLinks.linkToSingleResource(Account.class, parent.getId()); 
      Link parentLink = new Link(parentAccountLink.getHref(), "parent"); 
      links = new Link[] {selfLink, accountLink, subAccounts, owner, parentLink}; 
     } 

     return new AccountResource(entity, links); 
    } 
} 

那然後被注射到控制器(帶@RepositoryRestController註釋),反過來,生成響應。

在這個系統中,我們有一個控制器的共享基類,我們有一個多租戶設置,其中所有非平凡的非查找域對象(例如,存儲系統數據的所有內容)直接或間接引用賬戶對象,這是什麼控制和代表租賃。所以我們在一個地方爲一個物體做這件事,我們就完成了。其他鏈接更爲人性化,隨着時間的推移,我們基本上只是聳聳肩,並保留默認的Spring HATEOS輸出,讓客戶端適應它。只有在默認情況下會導致多次往返到後端時,我們纔會改變它 - 這是Spring用來處理它的默認方式的基本問題。但這是一個折衷。當後端資源本身被聲明爲延遲解析引用時,Spring的默認設置不會造成額外開銷。漂亮的增強,這將是有它是關於讓那些已經獲取直接通過在REST響應自己的ID引用這些資源更聰明。

+0

任何這樣的例子,特別是你如何從一種類型的鏈接轉換爲另一種? – cranphin

+0

用代碼示例更新了答案。 HTH。 – sofend

+0

如果這對你有用,upvote將不勝感激。 – sofend