2014-06-17 37 views
7

使用彈簧數據REST我公開了ProjectRepository,它支持列出項目並對它們執行CRUD操作。當我去http://localhost:8080/projects/時,我得到了我期望的項目清單。彈簧數據中的收集實體上的鏈接REST

我想要做的是將自定義操作添加到Project Collection的JSON響應的_links部分。

例如,我想調用http://localhost:8080/projects/返回是這樣的:

{ 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/projects/{?page,size,sort}", 
     "templated" : true 
    }, 
    "search" : { 
     "href" : "http://localhost:8080/projects/search" 
    }, 
    "customAction" : { 
     "href" : "http://localhost:8080/projects/customAction" 
    } 
    }, 
    "page" : { 
    "size" : 20, 
    "totalElements" : 0, 
    "totalPages" : 0, 
    "number" : 0 
    } 
} 

customAction在某些控制器定義。

我試圖創建下面的類:

public class ProjectCollectionResourceProcessor implements ResourceProcessor<Resource<Collection<Project>>> { 

    @Override 
    public Resource<Collection<Project>> process(Resource<Collection<Project>> listResource) { 
     // code to add the links to customAction here 
     return listResource; 
    } 

} 

並添加添加以下豆到我的應用程序的配置:

@Bean 
public ProjectCollectionResourceProcessor projectCollectionResourceProcessor() { 
    return new ProjectCollectionResourceProcessor(); 
} 

process(...)不會永遠似乎被調用。什麼是添加鏈接到資源集合的正確方法?

+0

另見,這個問題:http://stackoverflow.com/q/40156413 –

回答

4

集合資源渲染的實例爲Resources<Resource<Project>>,而不是Resource<Collection<Project>>。因此,如果您相應地更改ResourceProcessor實施中的通用鍵入,應該按照您的預期工作。

+0

添加下面的代碼並沒有幫助'公共類ProjectsResourceProcessor實現 \t \t ResourceProcessor <資源> { \t @Autowired \t private EntityLinks entityLinks; \t @覆蓋 \t公共資源處理(資源資源){ \t \t resources.add(entityLinks.linkFor(Project.class).slash( 「定製」) \t \t \t \t .withRel( 「定製」 )); \t \t返回資源; \t} }使用SDR-2.1.0.RELEASE – Stackee007

+0

爲了讓我使用它,我必須實現'ResourceProcessor '並在代碼中確定它是否是'Project'資源。謝謝您的幫助。 –

+0

@ thorben.jakobsen我正在尋找一些資源(學習的:-)來實施您的解決方案。我也有一個分頁資源。 – Stephane

4

我有同樣的問題。什麼工作對我來說是:

public class ProjectsResourceProcessor implements ResourceProcessor<PagedResources<Resource<Project>>> { 

    private final @NonNull EntityLinks entityLinks; 

    @Override 
    public PagedResources<Resource<Project>> process(PagedResources<Resource<Project>> pagedResources) { 

     ... 

     return pagedResources; 
    } 
} 
+0

被調用,當沒有項目時,鏈接不會出現:'( – Kakawait

+0

)在ResourcesProcessorWrapper :: isValueTypeMatch中有明確的檢查來檢查爲空的內容,它可以防止資源處理器發射。 –

+2

是面臨同樣的問題..任何破解,以克服這一點 –