2017-09-12 20 views
0

我有兩個使用Spring Boot的REST服務在兩個不同的服務器上運行。我正在使用REST模板進行此通信。在涉及泛型和轉換多態類型的Web服務之間傳遞基類類型列表

這些服務共享一些模型。所有這些模型的類型都是'IDataToTransferred'。

「IDataToTransferred」是由各種模型Bean實現的標記接口。

我需要編寫一個通用邏輯,以在這些REST服務之間傳遞這些模型的列表。

因此我寫了一個邏輯,它使用從發件人服務到Receiver服務的參數 List<? extends IDataToTransferred>

更新:一些代碼

IDataToTransferred.java是一個標記接口

DataToBeSent.java

DataToBeSent Implements IDataToTransferred{ 
    //Simple Pojo 
} 

SenderService.java

sendData(List<? extends IDataToTransferred> uploadDataObjectList){ 
//Some Code with REST Template 
//restTemplate.postForEntity 
} 

IDataToTransferred接口在通信Web服務之間共享。

DataToBeReceived.java

DataToBeReceived Implements IDataToTransferred{ 
//Simple Pojo 
} 

ReceiverService.java

receiveData(List<? extends IDataToTransferred> uploadDataObjectList){ 
//Some Code to convert uploadDataObjectList to DataToBeReceived 
} 

注意在REST服務,我總是得到415錯誤。不支持的媒體類型。當我在Receiver上使用相同的List<? extends IDataToTransferred>時。

當我在Receiver端將其更改爲List<? super IDataToTransferred>,現在它工作,我猜測是因爲Producer擴展了Consumer超規則。

但問題是,現在我不能在接收方上對IDataToTransferred類型進行類型轉換。在列表中我得到所有linkedHashmap,json被轉換爲這些服務之間的鏈接HashMap。

如何在ReceiverService中獲取DataToBeReceived類對象?

爲了簡單起見,我刪除了控制器。假定它們與服務具有相同的簽名。

+0

你期望得到哪個答案?您尚未發佈一行代碼。沒有什麼魔法可以通過一些不明確的解釋來解決問題。 – StanislavL

+0

當然。我將發佈代碼。儘管我使用@JsonSubTypes獲得瞭解決方案 – DragonZoned

回答

0

如果我知道更好的搜索條件,我會在發佈之前找到答案。可惜。

在任何情況下,我發現在stackoverflow頁here連同this博客的課程的答案。

這些例子與抽象類有關。我用過接口。

正如鏈接中所述。

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
@Type(value = DataToBeSent.class, name = "datatransfer")}) 

屬性類型在豆DataToBeSent作爲屬性引入:我在標記接口IDataToTransferred引入下面的註釋。此類型參數用作從接口類型轉換爲實現類型的信息。可以使用不同於名爲「」型號的變量。在JsonSubTypes註解中,我們提到了實現這個接口的類。

DataToBeSent Implements IDataToTransferred{ 
//Simple Pojo 
// Some Properties with getter and setter 
    String type = "datatransfer"; 
//with getter and setter 
} 

同樣的練習也需要在接收方執行。因此,我們必須標註如下:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
@Type(value = DataToBeReceived.class, name = "datatransfer")}) 

在這裏,我們DataToBeReceived類作爲實施IDataToTransferred接口。 Ofcourse,你需要爲屬性添加類型也如下DataToBeReceived類:

DataToBeReceived Implements IDataToTransferred{ 
//Simple Pojo 
// Some Properties with getter and setter 
    String type = "datatransfer"; 
//with getter and setter 
} 

希望這有助於。