2017-03-29 64 views
2

我已經創建瞭如下Projection春數據休息ResourceProcessor投影異常

@Projection(name = "select", types = {Organisation.class}) 
public interface OrganisationSelectProjection { 

    Long getId(); 

    String getName(); 

} 

,我要在「選擇」部件基本上都用,所以我需要最少的數據成爲可能。所以,我也想刪除所有與ResourceProcessor的聯繫,所以我創造了這個:

@Bean 
public ResourceProcessor<Resource<OrganisationSelectProjection>> organisationProcessor() { 
    return resource -> { 
     resource.removeLinks(); 
     return resource; 
    }; 
} 

但是,它看起來像這樣打破了,因爲無論端點我打我得到下面的異常信息的整個API org.springframework.hateoas.PagedResources cannot be cast to org.springframework.hateoas.Resource

任何想法我已經做錯了?

+0

你使用的是什麼版本的* spring-hateoas *?春季啓動1.5.2(當前)有spring-hateoas-0.23它必須正常工作... – Cepr0

+0

我使用Spring-Boot 1.4.3的0.20.0,但我會更新到1.5.2並嘗試它out – ChrisGeo

+0

使用1.5.2測試過,仍然不起作用 – ChrisGeo

回答

2

如果您想保留匿名課程,使用ResourceSupport而不是Resource可以解決問題。

@Bean 
public ResourceProcessor<ResourceSupport> organisationProcessor() { 
    return resource -> { 
     resource.removeLinks(); 
     return resource; 
    }; 
} 

但是,在這種情況下,處理器將在無論何種類型的內容的每一個資源使用(你可以檢查方法體內雖然)。

相反的ResourceProcessor匿名後代,你可以將它定義爲一個獨立的類:

public class OrganizationResourceProcessor implements ResourceProcessor<Resource<OrganisationSelectProjection>> { 
    @Override 
    public Resource<OrganisationSelectProjection> process(Resource<OrganisationSelectProjection> resource) { 
     resource.removeLinks(); 
     return resource; 
    } 
} 

@Bean 
public OrganizationResourceProcessor organisationProcessor() { 
    return new OrganizationResourceProcessor(); 
} 

你expereinced問題有事情做與類型擦除因爲沒有在匿名類中的任何類型參數實現。您的定義是類型安全的,但它缺少在運行時用於確定特定ResourceProcessor是否可以處理資源的類型相關數據。因此spring-data-rest認爲匿名organizationProcessor可以處理PagedResources並將其提供給發生ClassCastException的處理器。

並非全部spring-data-rest通過ResourceProcessor s是Resource。可以有org.springframework.hateoas.ResourceSupport類別的不同後代(例如PagedResources),其中大多數不是從Resource繼承。

+0

不幸的是,實現lambda的方式受到限制。我在郵件列表中提出了這個問題,但沒有得到太多回復:http://mail.openjdk.java.net/pipermail/compiler-dev/2017-January/010675.html –