2017-08-21 92 views
1

我使用一個類層次結構,其如下一個JOINED繼承策略REST端點:Spring MVC的 - 對於繼承層次

abstract super class Product

concrete sub class Type1Product extends Product

concrete sub class Type2Product extends Product

現在我想創建一個允許用戶發佈數據並將其作爲產品的特定子類進行分析的REST端點,確保其對於任何類型的產品都具有相同的端點。因此,像下面:

@RequestMapping(method = POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) 
    public Product save(@Valid Product product) { 
     // ... 
     return product; 
    } 

目前,當我嘗試後我得到一個錯誤,說我不能初始化一個抽象類,因爲春天是試圖建立一個產品實例,而不是正確的實例亞型。

是我想要做的可能嗎?如果不是,那麼在爲繼承層次構造類似這樣的端點時,最佳做法或慣例是什麼?

+0

如果您在返回時保持產品類別具體並返回可能解決問題的特定產品 –

+0

但是這在概念上會不正確,因爲產品本身不應存在。我不介意改變這種方法,只是想知道這種情況通常如何處理。 – user3690467

回答

0

讓我們看看你正在嘗試做什麼,你試圖反序列化一個對象,並且你正在告訴傑克遜它的Product是你的抽象類,並且你希望Jackson自己找到具體的類。

這不可能實現,它是有道理的,可以說傑克遜可以建立基於附加屬性的具體類,好吧,假設我們有兩個具體類沒有附加屬性,在這裏如何傑克遜會找出具體的課程是什麼?

指定反序列化的類時,默認的構造函數將被調用,所以如果你的類是抽象的將不起作用,你需要每個具體類的端點或者你需要一個DTO和模型映射器,你的DTO可以包含具體的類和所有可能的屬性和模型映射器都應該依賴於DTO中指定的具體類,使用這種方法可以在一個端點中完成。

+0

我實際上並沒有使用傑克遜,但我明白你的意思,並且我認爲同樣的事情,所以我想單獨的終端/控制器是最好的方法? – user3690467

+0

@ user3690467你在用什麼?春天默認使用傑克遜,你可以去DTO/modelmapper,我發現它是一個代表解決方案 –