2014-04-14 56 views
12

我有一個標準的Spring數據JPA和Spring數據Rest設置,它可以正確地將關聯返回爲正確資源的鏈接。在Spring Data Rest響應中選擇性地擴展關聯

{ 
    "id": 1, 
    "version": 2, 
    "date": "2011-11-22", 
    "description": "XPTO", 
    "_links": { 
     "self": { 
      "href": "http://localhost:8000/api/domain/1" 
     }, 
     "otherDomain": { 
      "href": "http://localhost:8000/api/domain/1/otherDomain" 
     } 
    } 
} 

然而,在一些請求我想有關聯的「otherDomain」擴展(所以客戶端不必做N + 1個請求得到完整的數據)。

是否可以配置Spring Data Rest來以這種方式處理響應?

+0

[spring-data-rest可能的重複,你可以提供實體的全部細節而不是(或與)鏈接](http://stackoverflow.com/questions/21975618/spring-data-rest-can-you - 提供完整的實體細節 - 而不是 - 或 - 與 - li) – bluish

回答

21

默認響應將保持不變,以確保PUT請求的有效負載與對應的GET的返回對稱。然而,春季數據REST介紹了工作原理如下特徵稱爲投影(見JIRA ticket瞭解詳細信息):

您創建一個專用接口,並添加要在應對包括所有的屬性:

public interface MyProjection { 

    String getMyProperty(); 

    MyRelatedObject getOtherDomain(); 
} 

您可以使用

@Projection,並將其放置在非常相同的封裝域類型或它
  • 一個子包的接口
    • 註釋或者您使用RepositoryRestConfiguration手動註冊投影並手動呼叫projectionConfiguration().addProjection(…)(通過擴展RepositoryRestMvcConfiguration並覆蓋configureRepositoryRestConfiguration(…))。

    這將導致暴露域類型的資源接受projection參數(名稱也可配置ProjectionConfiguration)與突出的名稱。如果給定,我們將跳過默認渲染(其中包括渲染指向相關實體的鏈接而不是嵌入它們),並讓傑克遜渲染支持給定接口的代理。

    這個例子也可以在Spring RESTBucks項目中找到。有關接口定義,請參閱OrderProjection

  • +4

    是否有可能通過預測進一步向下擴展?例如,如果'otherDomain'本身後面的對象本身與'oneMoreDomain'有關聯,那麼這也可以添加到原始響應中嗎? – muenchdo

    +1

    我想如果你的'MyProjection'的'getOtherDomain()'方法返回投影到'oneMoreDomain',那麼它是可能的。 – djxak

    +1

    @Oliver Gierke,你救了我幾口!這真的應該在官方文檔,我不知道爲什麼它不是:(http://docs.spring.io/spring-data/rest/docs/2.2.1.RELEASE/reference/html/我其實想擴大一些'EAGER'協會默認投影,但我似乎無法做到這一點:(你知道怎麼做?所以現在,「@投影」工作...提交https://jira.spring.io/browse/DATAREST-419 –

    0

    我的解決方案適用於所有請求,但有些可能會發現它的相關性。

    我有一個simular情況,在那裏我有userPersons嵌套在我用戶 JSON響應協會,像這樣:

    { 
    "_embedded":{ 
        "users":[ 
        { 
         "userName":"Albert" 
         "userPersons":[ 
          { 
           "personId":2356, 
           "activeBoolean":1 
          }, 
          { 
           "personId":123617783, 
           "activeBoolean":1 
          } 
         ], 
         "_links":{ 
          "self":{ 
           "href":"http://localhost:8080/api/users/1" 
          } 
         } 
        } 
        ] 
    

    } }

    我的基本實體,像這樣:

    @Entity 
    public class User { 
    
    
    ... 
    
    @Getter @Setter 
    private String userName; 
    
    @Getter @Setter 
    @OneToMany(mappedBy = "user") 
    private Set<Userperson> userPersons; 
    

    }

    和單個存儲庫:

    @RepositoryRestResource 
    public interface UserRepo extends JpaRepository<User, Integer> { 
    } 
    

    我的解決辦法是這樣的:

    只需露出Userperson @RepositoryRestResource,春數據其餘部分將嵌入您的關聯。

    如果您爲嵌套類型定義了@RepositoryRestResource,則Spring Data Rest將呈現到該資源的鏈接並且不嵌入它。

    如果您需要內部業務邏輯的嵌套類型存儲庫,請將其設置爲@RepositoryRestResource(exported = false),以具有相同的行爲。

    爲了避免1 + N問題,你可以配置關聯加載,也許使用@EntityGraph,比如this guy - 儘管我還沒有找到在Spring Data Rest中實現這個的最佳方法。

    相關問題